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 */
在C语言中,我认为a[]
和*p
是完全一样的东西。
但是,正如1号和4号显示的那样,我发现您不能将其分配给a
之类的数组名,而可以将其分配给p,因为它是指针。
这是用两种不同的方式声明字符串数组之间的唯一区别吗?
话虽如此,如果您可以将其分配给指针,为什么没有2和3无效?
谢谢。
答案 0 :(得分:3)
数组和指针不是一回事。数组是相同对象的集合,而指针指向一个或多个对象。引起混淆的地方是,数组名称在表达式中使用时,在大多数情况下会分解为指向第一个元素的指针。这意味着a
和&a[0]
的评估结果相同。
查看每种情况:
p = &a[1];
这是有效的,因为a[1]
是char
,所以&a[1]
是char *
,它与p
的类型匹配。
p[1] = &a[1];
无效,因为p[1]
的类型为char
,但是&a[1]
的类型为char *
。在运行时也无效,因为p
指向无法修改的字符串常量。
p[1] = *a;
语法有效,因为p[1]
和*a
的类型均为char
。但是,p
指向无法修改的字符串常量,因此您最终得到undefined behavior
a= p;
无效,因为无法分配数组。