char *a[]={"hello", "world"}; 有什么区别?和 char a[][10]={"hello", "world"};?
What's the difference between char *a[]={"hello", "world"}; and char a[][10]={"hello", "world"};?
当我尝试这段代码时
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
,因此您可以更改存储的字符串。
这是一张内存布局图。这对应代码:
char *a[2] = { "hello", "world" };
char **p = a;
char b[][10] = { "hello", "world" };
char **q = b; // Error
红色 = 字符数组,绿色 = 指向字符的指针,青色 = 指向字符的指针。
A char **
(即指向 char *
的指针)只能指向 char *
变量,不能指向 char 数组。
如您所见,名为 p
的 char **
指向 char *
的存储。
可是q
可以指向哪里呢?没有正确类型的变量。如果您想直接指向 b
,或 b
的行,那么您需要一个指向 char 数组的指针(而不是指向 char 指针的指针)。
当我尝试这段代码时
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
,因此您可以更改存储的字符串。
这是一张内存布局图。这对应代码:
char *a[2] = { "hello", "world" };
char **p = a;
char b[][10] = { "hello", "world" };
char **q = b; // Error
红色 = 字符数组,绿色 = 指向字符的指针,青色 = 指向字符的指针。
A char **
(即指向 char *
的指针)只能指向 char *
变量,不能指向 char 数组。
如您所见,名为 p
的 char **
指向 char *
的存储。
可是q
可以指向哪里呢?没有正确类型的变量。如果您想直接指向 b
,或 b
的行,那么您需要一个指向 char 数组的指针(而不是指向 char 指针的指针)。