mirror of
https://github.com/wangdoc/clang-tutorial.git
synced 2026-02-11 06:35:43 +08:00
docs(struct): 修改 struct 的复制
This commit is contained in:
@@ -173,9 +173,9 @@ printf("%s\n", a.name); // Hula
|
||||
printf("%s\n", b.name); // Mula
|
||||
```
|
||||
|
||||
上面示例中,变量`b`是变量`a`的副本,两个变量的值是各自独立的,修改掉`b.name`不影响`a.name`。这一点跟数组完全不同,数组使用赋值运算符,不会复制数据,只会共享地址。
|
||||
上面示例中,变量`b`是变量`a`的副本,两个变量的值是各自独立的,修改掉`b.name`不影响`a.name`。
|
||||
|
||||
但是,稍作修改,结果就不一样。
|
||||
上面这个示例是有前提的,就是 struct 结构的属性必须定义成字符数组,才能复制数据。如果稍作修改,属性定义成字符指针,结果就不一样。
|
||||
|
||||
```c
|
||||
struct cat { char* name; short age; } a, b;
|
||||
@@ -186,9 +186,11 @@ a.age = 3;
|
||||
b = a;
|
||||
```
|
||||
|
||||
上面示例中,`name`属性变成了一个字符串指针,这时`a`赋值给`b`,导致`b.name`也是同样的字符串指针,指向同一个地址,也就是说两个属性共享同一个地址。因为这时,struct 结构内部保存的是一个指针,而不是上一个例子的数组,这时复制的就不是字符串本身,而是它的指针。
|
||||
上面示例中,`name`属性变成了一个字符指针,这时`a`赋值给`b`,导致`b.name`也是同样的字符指针,指向同一个地址,也就是说两个属性共享同一个地址。因为这时,struct 结构内部保存的是一个指针,而不是上一个例子的数组,这时复制的就不是字符串本身,而是它的指针。并且,这个时候也没法修改字符串,因为字符指针指向的字符串是不能修改的。
|
||||
|
||||
注意,这种赋值要求两个变量是同一个类型,不同类型的`struct`变量无法互相赋值。
|
||||
总结一下,赋值运算符(`=`)可以将 struct 结构每个属性的值,一模一样复制一份,拷贝给另一个 struct 变量。这一点跟数组完全不同,使用赋值运算符复制数组,不会复制数据,只会共享地址。
|
||||
|
||||
注意,这种赋值要求两个变量是同一个类型,不同类型的 struct 变量无法互相赋值。
|
||||
|
||||
另外,C 语言没有提供比较两个自定义数据结构是否相等的方法,无法用比较运算符(比如`==`和`!=`)比较两个数据结构是否相等或不等。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user