c - “结构被复制,数组被别名”这是什么意思?
问题描述
我在读克莱门斯,本。21st Century C: C Tips from the New School 和我被一句话“结构复制,数组获得别名”阻止了,我不太明白,这个例子对我来说也不是很清楚。谁能解释一下?
示例代码
#include <assert.h>
typedef struct{
int a, b;
double c, d;
int *efg;
} demo_s;
int main(){
demo_s d1 = {.b=1, .c=2, .d=3, .efg=(int[]){4,5,6}};
demo_s d2 = d1;
d1.b=14;
d1.c=41;
d1.efg[0]=7;
assert(d2.a==0);
assert(d2.b==1);
assert(d2.c==2);
assert(d2.d==3);
assert(d2.efg[0]==7);
}
克莱门斯,本。21世纪C:新学校的C提示。奥莱利媒体。Kindle版。
#include <assert.h>
int main(){
int abc[] = {0, 1, 2};
int *copy = abc;
copy[0] = 3;
assert(abc[0]==3);
}
克莱门斯,本。21世纪C:新学校的C提示。奥莱利媒体。Kindle版。
解决方案
这个任务:
demo_s d2 = d1;
在第一个示例中,实际上复制了结构的内容。所以这意味着如果原始结构更改了某些值,这将不会反映在副本中(它们不共享相同的引用),反之亦然。
另一方面,对于数组,赋值:
int *copy = abc;
仅分配要复制的数组的引用,但不复制数组的内容。因此,这意味着如果原始数组更改了某些值,则复制的引用(因为它们引用相同的引用)也将反映更改(反之亦然)。从某种意义上说(另请参阅此答案下方的评论)这copy
是另一个名称,因为abc
它们指的是同一个对象,如果您愿意,它是一个别名,因此解释
示例中的断言说明了 C 语言的这一特性。
请注意,在第一个结构示例中,该efg
字段是指向数组的指针,它也被复制但它复制了引用,因此这反映了对原始结构的字段所做的更改。
推荐阅读
- java - 我想在 .wav 中以 8000hz 的采样率在 android 手机中录制 6 秒的声音
- django - 如何在 DeleteView 中配置重定向
- haskell - 如何根据类型签名找到 Haskell 函数?
- javascript - 反应功能组件中的复选框导致重新渲染
- python - 使用 python 从 URL / XML 读取数据
- php - 我在我的 php 上传脚本中做错了什么?
- python-3.x - 使用“for”循环在 Python 中打印模式
- azure - 我用西班牙语创建了一个知识库,但机器人用英语响应
- performance - 原始类型 HashSet 或 HashMap 比 Object 快 10 倍?
- javascript - SyntaxError:jquery.datatables 中出现意外的标记“{”