当我尝试这段代码时
char *a[] = {"hello", "world" };
char **p = a;
char a[][10]={"hello", "world"};
我的编译失败,并被告知变量a存在冲突的类型错误。顶部声明与底部声明有何不同?
答案 0 :(得分:4)
在第一个声明中
char *a[] = {"hello", "world" };
数组a
的类型为char * [2]
。数组的元素的类型为char *
。
例如在表达式中用作初始化程序,它将隐式转换为指向其第一个类型为char **
的元素的指针,
所以这个声明
char **p = a;
是正确的。
此声明
char a[][10]={"hello", "world"};
声明类型为char [2][10]
的数组。数组的元素的类型为char[10]
。
用在表达式中,它隐式转换为指向类型char ( * )[10]
的第一个元素的指针。
所以正确的指针声明将是
char ( *p )[10] = a;
因此,这两个数组声明声明了不同类型的数组。
请注意,您不得使用第一个数组的元素(指针)更改字符串文字。
在第二个声明中,将文字的元素复制到数组的元素中。由于数组没有限定符const
,因此您可以更改存储的字符串。
答案 1 :(得分:4)
这是内存布局的图片。这对应于代码:
char *a[2] = { "hello", "world" };
char **p = a;
char b[][10] = { "hello", "world" };
char **q = b; // Error
红色=字符数组,绿色=指针到字符,蓝绿色=指针到字符。
char **
(即指向char *
的指针)只能指向char *
变量,而不能指向char数组。
如您所见,名为char **
的{{1}}指向p
的存储。
但是char *
指向哪里?没有正确类型的变量。如果要直接指向q
或b
的行,则需要一个指向char数组的指针(而不是指向char指针的指针)。