Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这是char*a[]={“hello”和“world”之间的区别;和char a[][10]={“你好”,“世界”};?_C_Arrays_Pointers_Declaration_Implicit Conversion - Fatal编程技术网

什么';这是char*a[]={“hello”和“world”之间的区别;和char a[][10]={“你好”,“世界”};?

什么';这是char*a[]={“hello”和“world”之间的区别;和char a[][10]={“你好”,“世界”};?,c,arrays,pointers,declaration,implicit-conversion,C,Arrays,Pointers,Declaration,Implicit Conversion,当我尝试这个代码时 char *a[] = {"hello", "world" }; char **p = a; char a[][10]={"hello", "world"}; 我的编译失败,我被告知变量a存在冲突类型错误。顶部声明与底部声明有何不同 在第一次声明中 char *a[] = {"hello", "world" }; char **p = a; char a[][10]={"hello", "world"}; 数组a的类型为char*[2]。数组元素的类型为char* 在

当我尝试这个代码时

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

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

在第一次声明中

char *a[] = {"hello", "world" };
char **p = a;
char a[][10]={"hello", "world"};
数组
a
的类型为
char*[2]
。数组元素的类型为
char*

在表达式中用作初始值设定项,它隐式转换为指向其第一个元素的指针,该元素的类型为
char**

所以这个宣言

char *a[] = {"hello", "world" };
char **p = a;
char a[][10]={"hello", "world"};
这是正确的

本声明

char *a[] = {"hello", "world" };
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

红色=字符数组,绿色=指向字符的指针,Teal=指向字符的指针

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

如您所见,名为
p
char**
指向
char*
的存储

但是
q
指向哪里呢?没有正确类型的变量。如果要直接指向
b
,或指向
b
行,则需要指向字符数组的指针(而不是指向字符指针的指针)