gpt4 book ai didi

c - 为什么C不能直接给数组赋值,而是可以在struct中给数组赋值?

转载 作者:太空狗 更新时间:2023-10-29 15:01:40 29 4
gpt4 key购买 nike

此代码无效:

int main() {
int arr1[10];
int arr2[10];

arr2 = arr1;
return 0;
}

但这行得通:

struct foo {
int arr[10];
};

int main() {
struct foo f1;
struct foo f2;

f2 = f1;
return 0;
}

但在我看来,它们做的是同一件事:只是将一个数组复制到另一个数组。

最佳答案

C 的历史发展的一个结果是您不能直接引用数组。

arr2 = arr1;中,arr2arr1都命名了一个数组。但是 C 中有一条规则,当在表达式中使用数组时,它会自动转换为指向其第一个元素的指针,但有某些异常(exception)。1 C 当然能够复制一个数组到另一个,如 memcpy(arr2, arr1, sizeof arr2);。问题是根本没有办法在赋值语句中引用数组。

这种数组的自动转换是为了方便访问数组的元素和以最初开发 C 语言时使用的方式使用数组。没有预料到需要将整个数组作为一个整体对象来引用,并且语言中没有为此构建任何内容。 (即使在今天,也没有必要——除了复制它之外,我们希望对数组作为单个对象执行的操作很少。)

早期的 C 实现也不允许您通过赋值复制结构。 C 是一种相当基础的语言,只提供简单的操作,复制整个结构本来就是一件很奇特的事情。后来,添加了复制结构的功能。

f2 = f1;中,f2f1指的是结构体,没有自动转换成什么的规则,就像数组一样。

所以问题只是能够表达所需操作的问题。

脚注

1 规则在 C 2018 6.3.2.1 3 中,当数组是 sizeof 或一元 & 的操作数时除外> 或者是用于初始化数组的字符串文字(如 char x[] = "abc";"abc" 是一个字符串文字,它是一个数组)。

关于c - 为什么C不能直接给数组赋值,而是可以在struct中给数组赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57635058/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com