From adef4fb27a793d9731ded1227d0ad5f6df55e785 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 29 Sep 2021 18:08:24 +0800 Subject: [PATCH] =?UTF-8?q?docs(struct):=20=E4=BF=AE=E6=94=B9=20struct=20?= =?UTF-8?q?=E7=9A=84=E5=A4=8D=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/struct.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/struct.md b/docs/struct.md index 110c001..c476c7b 100644 --- a/docs/struct.md +++ b/docs/struct.md @@ -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 语言没有提供比较两个自定义数据结构是否相等的方法,无法用比较运算符(比如`==`和`!=`)比较两个数据结构是否相等或不等。