当我尝试此代码时
char *a[] = {"hello", "world" };
char **p = a;
char a[][10]={"hello", "world"};
我的编译失败,并且我被告知变量a存在类型冲突的错误。顶部声明与底部声明有何不同?
在第一个声明中
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
,因此您可以更改存储的字符串。