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都是无效的呢?
谢谢。
最佳答案
数组和指针不是一回事。数组是相同对象的集合,而指针则指向一个或多个对象。令人困惑的地方在于,当在表达式中使用数组名称时,在大多数情况下,数组名称会衰减为指向第一个元素的指针。这意味着 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;
无效,因为无法分配数组。
关于c - 字符串数组指针/数组名称的有效赋值是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55485932/