C数组和指针,当我给数组一个新地址时会发生什么?

C数组和指针,当我给数组一个新地址时会发生什么?,c,C,所以我有两个字符数组: char results[80]; char *copy = "blah"; 当我说??,会发生什么 results = copy; 这是一个约束冲突,因为您不能使用=操作符重新分配数组。因此,如果您费心(在下面编写代码),您会注意到会收到一条类似以下内容的错误消息: prog.c:6:13: error: assignment to expression with array type 你会得到一个错误 test.c:8:13: error: array typ

所以我有两个字符数组:

char results[80];
char *copy = "blah";
当我说??,会发生什么

results = copy;

这是一个约束冲突,因为您不能使用
=
操作符重新分配数组。因此,如果您费心(在下面编写代码),您会注意到会收到一条类似以下内容的错误消息:

prog.c:6:13: error: assignment to expression with array type

你会得到一个错误

test.c:8:13: error: array type 'char [80]' is not assignable
    results = copy;
    ~~~~~~~ ^
这个。ISO标准的相关位为6.3.2.1

可修改左值是不具有数组类型、不具有不完整类型、不具有常量限定类型,并且如果是结构或联合,则不具有任何具有常量限定类型的成员(递归地包括所有包含的聚合或联合的任何成员或元素)

这就解释了原因

数组对象的角色在C语言中一直是一个典型的混淆源,这在很大程度上是因为数组引用被转换为指向其第一个元素的指针的大量上下文。虽然这种转换巧妙地处理了订阅的语义,但a[i]是 可修改的左值虽然不是,但却困扰了该语言的许多学生。C89中包含了更精确的描述,希望能够消除这种混乱


啊,还有。。。是的,这真的没有多大帮助。

让我把程序简化为:

字符a[]=“中暑”; char*b=a

假设a的地址是100,那么在内存中,它看起来是这样的(仅说明指针的大小和端点等可能不同):

只要阵列的生命周期不变,a将始终处于同一位置,您不能对其进行修改

b、 另一方面,是一个包含数组地址的指针,您可以修改b的值以指向其他位置。

您可以使用
strcpy()
函数

char results[80];
char *copy = "blah";

strcpy( results, copy );
printf("%s\n",results);

什么也没发生。它不会编译。在C语言中不能“给数组一个新地址”。
[S] [u] [n] [s] [t] [r] [o] [k] [e] [\0]         ...       [0] [0] [0] [100]
100 101 102 103 104 105 106 107 108 109                           200
 ^                                                                 ^
 |                                                                 |
 a                                                                 b
char results[80];
char *copy = "blah";

strcpy( results, copy );
printf("%s\n",results);