关于指向指针的指针,求解——谭浩强教材解决办法

关于指向指针的指针,求解——谭浩强教材
main() 
{char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer desighn"}; 
 char **p; 
 int i; 
 for(i=0;i<5;i++) 
  {p=name+i; 
  printf("%s\n",*p); 
  } 
}
本人看法:name不是name[]的首地址么,那么*p应该是name[]里的内容,即存放字符串的地址,而**p才是*name[]里的内容,即Follow me……

现实情况:而在这里的这个程序,只需*p就能输出Follow me……呢?不解,求解,谢谢!


------解决方案--------------------
char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer desighn"};

这句话可以这么理解:
1. 有一个数组name
2. 数组中的元素的数据类型是char*(把char*看成是一个整体,比如char* s1 = "abc",也就是说char*是一个字符串的数据类型)

C/C++ code

#include <stdio.h>

typedef char* STR;    // STR代表字符串这样的数据类型
int main(int argc, char** argv) 
{
    char *name[] = {"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};    // 和下一句同义
    STR name2[] = {"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};

    int i;
    char **p; 
    for(i = 0; i < 5; i++) 
    {
        p = name + i; 
        printf("%s\n", *p); 
    }

    STR* p2;   // 和char **p; 同义,相当于一个STR的指针。下面的代码和上面一段代码同义。
    for(i = 0; i < 5; i++) 
    {
        p2 = name2 + i; 
        printf("%s\n", *p2);    // p2是一个字符串的指针,那么*p2就是一个字符串,即*p2的数据类型是STR或者char*
    }
     
    return 0;
}

------解决方案--------------------
你还没有理解字符串就是一个地址,上面是定义一个字符指针数组,也就是说数组中的每个元素都是一个字符指针(字符串即是地址),name是name[0]地址,p也是name[0]地址,*p就是name[0],name[0]本身是一个字符指针,这个指针保存的是字符串的地址,所以打印的时候会打印出字符串,**p是name[0]所指向的内存的一个字符,而不是字符串。

说的不太清楚,希望你能理解。