docs(struct): 修改 struct 的复制

This commit is contained in:
ruanyf
2021-09-29 18:08:24 +08:00
parent f230c433aa
commit adef4fb27a

View File

@@ -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 语言没有提供比较两个自定义数据结构是否相等的方法,无法用比较运算符(比如`==``!=`)比较两个数据结构是否相等或不等。