char * a[5] ={"abc","efasg","asgfw"};
------ 应该是
const char* a[5] = { "abc", "efasg", "asgfw" };
因为 a[0] 的类型是 const char[4],a[1]、a[2] 的类型是 const char[6],它们俱可降阶为 const char*。
不加const时部分编译器不报错,只是为了照顾历史上遗留的旧代码,不是让你现在仍然这样用的。
a[0]的值不是字符串的地址吗?
------ 是
怎么能直接显示字符串
------ printf函数就是这么实现的,%s后面对应一个字符串地址,它输出这个地址处的字符串。
知道了地址,就可以取地址处的值,不知道你的疑惑从何而来?
a是二级指针
------ 不,a不是指针,当然也不是什么二级指针(C/C++标准中根本就没这说法)。
a是数组,a是一个元素类型为const char*,容量为5的数组。
*a是指向指针的值
------
数组可隐式降阶为指针,故 *a 就是 *(&a[0]),即 a[0]
**a才是字符串的值吧?
------ 上面讲过 *a 等同于 a[0],因此 **a 等同于 *a[0]。同理,它也就是 a[0][0],即 'a'。
但第3行是错的..用一个*就能显示字符串
------ 由上可知,printf("%s",**a)等效于printf("%s",'a'),当然是错误的;
printf("%s",*a)等效于printf("%s","abc"),当然是正确的。