对字符串数组指针/数组名称的有效分配是什么?

时间:2019-04-03 01:56:11

标签: c arrays pointers

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无效? 谢谢。

1 个答案:

答案 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;

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