C语言问题

# include <stdio.h>
int main ()
{
char * name[] = "Follow me","BASIC",......"
char ** p;
int i;
for (i = 0;i<5;i++)
{
p = name + i;
printf("%s\n",*p);
}
return 0;
}
*p是地址对不对,即使是地址把他以%s格式输出怎么能输出内容(字符串)呢?我认为**p即*(*p),把**p(内容)输出才能输出字符串,把地址以其他形式输出就能输出他存储单元的内容?真想不明白,请大神耐心解答感激不尽

char p是声明一个字符类型变量p,char * p1是声明一个字符类型的指针变量p1,那么char ** p2就相当与给char类型的指针变量再声明一个指针.(2级指针)
举个例子,假如:
char p='a';//假设声明了p后,p在内存的1000处,则&p=1000(&为取变量首地址)
char * p1=&p;//则p1=1000,*p1=p='a',p1就和p关联了;假设p1被放在2000处
char ** p2=&p1;//则p2=2000,*p2=p1=&p=1000,**p2=&p1=p='a'

# include <stdio.h>
int main ()
{
    char * name[] = {"Follow me","BASIC","......"};
    char ** p;
    int i;
    for (i = 0;i<3;i++)
    {
        p = name + i;
        printf("%s\n",*p);
    }
    return 0;
}

这里*p就是name+i的地址,而输出%s给的变量就是地址。。

追问

正是因为*p2=p1=&p=1000,**p2=&p1=p='a'啊,所以我才认为输出**p2就是输出字符串,我所不明白的是,*p2是地址对不对,既然是地址,(那把地址以字符串的形式输出就得到地址所指向的内容了?),所以还是不明白,我理解能力有限,请大神进一步解答谢谢

追答

比如你定义一个char name[] = "12345",那么printf ("%s", name);是输出name的值,这里name即是指向“12345”的首地址地址;
p = name+i,这里name+i是地址,所以*p就是name+i的地址,而name+i即是指向第i个字符串的首地址,所以就是这样。。。

追问

好,大神,基本都懂了,我有点好奇,如果printf(“%s\n",*name);这样输出的话会出错,为什么会出错,请说一下他的执行步骤以及原因谢谢,加10分

追答

比如你定义一个char name[] = "12345",name表示首地址,那么*name就是首地址的值,即'1',输出*name需要这样printf ("%c", *name);%s格式是字符串中遇到'\0'结束输出的,*name表示一个字符,显然是遇不到'\0'的,所以出错。。。。

温馨提示:答案为网友推荐,仅供参考
相似回答