该代码不起作用:
int main() {
int arr1[10];
int arr2[10];
arr2 = arr1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这有效:
struct foo {
int arr[10];
};
int main() {
struct foo f1;
struct foo f2;
f2 = f1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是在我看来,它们做同样的事情:只需将一个数组复制到另一个数组。
C 的历史发展的一个结果是你不能直接引用数组。
在arr2 = arr1;,arr2和 中arr1命名一个数组。但是在 C 中有一条规则,即当在表达式中使用数组时,它会自动转换为指向其第一个元素的指针,但有某些例外。1 C 当然能够将一个数组复制到另一个数组,就像memcpy(arr2, arr1, sizeof arr2);. 问题是根本无法在赋值语句中引用数组。
这种数组的自动转换旨在为访问数组元素和以最初开发 C 语言时使用的方式处理数组提供便利。没有预料到需要将整个数组作为一个完整的对象来引用,并且语言中没有为此内置任何内容。(即使在今天,也没有必要——除了复制它之外,我们希望对作为单个对象的数组执行的操作很少。)
早期的 C 实现也不允许您通过赋值复制结构。C 是一种相当基本的语言,只提供简单的操作,复制整个结构是一件很奇特的事情。后来,添加了复制结构的功能。
在f2 = f1;,f2和f1引用结构,并且没有关于它们被自动转换为任何东西的规则,就像数组一样。
所以问题只是能够表达所需的操作。
1规则在 C 2018 6.3.2.1 3 中,例外情况是当数组是sizeof或 一元的操作数或者&是用于初始化数组的字符串文字时(如char x[] = "abc";—"abc"是字符串文字,它是一个数组)。
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |