char * a [] = {“ hello”,“ world”}之间有什么区别?和char a [] [10] = {“ hello”,“ world”} ;?

时间:2019-12-15 23:52:04

标签: c arrays pointers declaration implicit-conversion

当我尝试这段代码时

char *a[] = {"hello", "world" };
char **p = a;
char a[][10]={"hello", "world"};

我的编译失败,并被告知变量a存在冲突的类型错误。顶部声明与底部声明有何不同?

2 个答案:

答案 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

Memory layout diagram

红色=字符数组,绿色=指针到字符,蓝绿色=指针到字符。

char **(即指向char *的指针)只能指向char *变量,而不能指向char数组。

如您所见,名为char **的{​​{1}}指向p的存储。

但是char *指向哪里?没有正确类型的变量。如果要直接指向qb的行,则需要一个指向char数组的指针(而不是指向char指针的指针)。