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

标签 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都是无效的呢? 谢谢。

最佳答案

数组和指针不是一回事。数组是相同对象的集合,而指针则指向一个或多个对象。令人困惑的地方在于,当在表达式中使用数组名称时,在大多数情况下,数组名称会衰减为指向第一个元素的指针。这意味着 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/

相关文章:

javascript - 无法读取 Javascript 中未定义错误消息的属性 'length'

c - free(ptr) where ptr is NULL 会损坏内存吗?

C:我应该在哪里释放我的指针?

c - 结构中的链表

c - 我想用指针将一些字符串放在动态二维数组中(C 编程)

java - 如何清除 JSON 数组中的数据

javascript - MooTools:如何判断对象是否为数组?

c - 无链表的内存分配

c - 在 github 上发布 API key

c - 为什么C程序中调用线程数比执行线程数多?