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