C 字符串数组指针/数组名称的有效赋值是什么?

C 字符串数组指针/数组名称的有效赋值是什么?,c,arrays,pointers,C,Arrays,Pointers,在C语言中,我认为a[]和*p是完全相同的东西。 但是,正如1号和4号所示,我发现您无法将其分配给数组名,如a,而您可以将其分配给p,因为它是一个指针。 这是以两种不同方式声明字符串数组的唯一区别吗? 话虽如此,如果您可以将其分配给指针,为什么2号和3号无效? 谢谢。数组和指针不是一回事。数组是相同对象的集合,而指针指向一个或多个对象。混淆之处在于,在表达式中使用数组名时,在大多数情况下,数组名会退化为指向第一个元素的指针。这意味着a和&a[0]的计算结果相同 查看每个案例: char a[]

在C语言中,我认为
a[]
*p
是完全相同的东西。
但是,正如1号和4号所示,我发现您无法将其分配给数组名,如
a
,而您可以将其分配给p,因为它是一个指针。
这是以两种不同方式声明字符串数组的唯一区别吗?
话虽如此,如果您可以将其分配给指针,为什么2号和3号无效?
谢谢。

数组和指针不是一回事。数组是相同对象的集合,而指针指向一个或多个对象。混淆之处在于,在表达式中使用数组名时,在大多数情况下,数组名会退化为指向第一个元素的指针。这意味着
a
&a[0]
的计算结果相同

查看每个案例:

char a[] = "hello";
char *p = "world";
p = &a[1]; /* no 1, valid */
p[1] = &a[1]; /* no 2, invalid*/
p[1] = *a; /*no 3, invalid*/
a= p /* no 4, invaild */
这是有效的,因为
a[1]
char
所以
&a[1]
char*
,它与
p
的类型相匹配

p = &a[1];
无效,因为
p[1]
具有类型
char
,但
&a[1]
具有类型
char*
。在运行时也无效,因为
p
指向无法修改的字符串常量

p[1] = &a[1];
该语法有效,因为
p[1]
*a
都具有类型
char
。但是,
p
指向一个无法修改的字符串常量,因此您最终得到


无效,因为无法将数组分配给。

提示:什么类型是
p[1]
?另一个提示:a[]和*p不是完全相同的东西。试试a码和p码。@niry当我做a码和p码的时候,我得到了6码和8码。你能解释一下原因吗?@tadman这是一个字符。但你能解释为什么它是常数吗?@JessicaKim当然
sizeof(a)
是6,它是数组“hello”(5)加上空字符“\0”(1)的大小
sizeof(p)
是8,它是64位体系结构上指针的大小(8字节*8位=64位),谢谢。但是为什么p[1]是字符串常量,而a[1]不是?@JessicaKim
a
是一个用字符串常量初始化的数组。它的元素包含与字符串常量相同的值,但它不是同一个对象<另一方面,code>p指向字符串常量,因此取消对
p
的引用将为您提供字符串常量的元素。
p[1] = *a;
a= p;