定理说我们不能将数组初始化为另一个数组的副本.但是我们可以将指针初始化为指向另一个数组的第一个元素的指针副本:
int a[] = {0, 1, 2};
int a2[] = a; //error
int *a3 = a; //OK
Run Code Online (Sandbox Code Playgroud)
为什么int a2[] = a;会出错?
Ste*_*sop 15
数组不能在C++中从另一个数组对象中分配或初始化,因为它们不能在C中,并且由于历史原因它们不能再存在于C中.
在非常早期的原-C的话会有一些混乱像分配是否int a[] = {0}; int b[] = {0}; a = b;应该复制数组的内容b到a,或重新座位的名称a来指代b.与初始化一样,无论a是副本b还是别名.这种模糊性已经存在了40年:很快就会明白,如果它被允许,那么C(和C++)中的合理含义将是它应该复制,但C中的数组从未被制成"适当的"值类型.
没有技术原因导致它不可能,例如,您可以指定一个具有数组作为数据成员的结构类型.标准只是没有将您的代码定义为正确的C++.
指针的行为与此没有直接关系.初始化指针(指向数组的第一个元素)与初始化数组及其内容的操作不同,语言允许RHS上的不同内容.
数组不是指针,所以你不能指望像指针一样使用它们而不会遇到麻烦.访问https://blogs.oracle.com/ksplice/entry/the_ksplice_pointer_challenge,了解有助于您了解其中的活动.
如果将数组包装在结构中,则可以将数组初始化为另一个数组的副本.
struct myarray {
int a[3];
};
Run Code Online (Sandbox Code Playgroud)
如果您的编译器允许GNU C++样式指定的初始值设定项:
myarray a = {a: {0, 1, 2}};
Run Code Online (Sandbox Code Playgroud)
这会执行结构的副本,包括a2数组的数组.
myarray a2 = a;
Run Code Online (Sandbox Code Playgroud)
数组将位于内存中的不同位置:
bool is_different_array = a2.a != a.a; // true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1879 次 |
| 最近记录: |