From a6ef200de098328d947bb0187de6b347019d59c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E5=A4=A7=E4=BB=99?= <1900919313@qq.com> Date: Fri, 11 Oct 2024 05:50:44 +0000 Subject: [PATCH] =?UTF-8?q?2024=E5=B9=B410=E6=9C=8811=E6=97=A5=2013:50?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notes/02_c-leap/07_xdx/index.md | 89 +++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 2 deletions(-) diff --git a/docs/notes/02_c-leap/07_xdx/index.md b/docs/notes/02_c-leap/07_xdx/index.md index e033d42..7de8cf4 100644 --- a/docs/notes/02_c-leap/07_xdx/index.md +++ b/docs/notes/02_c-leap/07_xdx/index.md @@ -339,7 +339,7 @@ int main() { ### 2.2.2 需求分析 2 -* 隔壁老王养了两只猫咪。一只名字叫小黄,今年 2 岁,橘色;另一只叫小黑,今年 3 岁,黑色。请编写一个程序,当用户输入小猫的名字 时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示老王没有这只猫。 +* 隔壁老王养了两只猫咪。一只名字叫小黄,今年 2 岁,橘色;另一只叫小黑,今年 3 岁,黑色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示老王没有这只猫。 ![](./assets/6.png) @@ -357,7 +357,8 @@ int main() { > [!NOTE] > -> C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。 +> * ① C 语言没有其他面向对象编程语言中的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。 +> * ② C++ 语言并不是一种完全面向对象的语言,Java 语言和 C# 才是完全面向对象的编程语言。 ## 2.4 结构体的基本使用 @@ -1371,6 +1372,82 @@ int main() { > * ④ 内存对齐的时候可能会出现“填充”字节,但是并不会改变原来数据的大小,即:char 类型的数据即使“填充”字节之后,本身还是 1 个字节。 > * ⑤ `心得`:我们会将小的数据类型,写在最上面;大的数据类型,写在最下面(节省内存空间)。 +### 2.5.3 结构体变量之间的赋值操作 + +* 在 C 语言中,同类型的`结构体变量`之间的`赋值`是`值传递`,而不是`地址传递`。 + +> [!NOTE] +> +> * ① 当我们将一个结构体变量赋值给另一个结构体变量时,实际上是将源结构体中的所有成员变量的值`逐个复制`到目标结构体中。因此,目标结构体会得到源结构体的一个`独立副本`,两者在内存中的数据是`完全独立`的。 +> * ② 修改源结构体的成员变量不会影响目标结构体的成员,反之亦然,因为它们是独立的副本。 +> * ③ 在 Java 中,对象之间的赋值是`地址传递`。但是,C 语言中结构体变量之间的赋值是`值传递`。 + + + +* 示例: + +```c +#include +#include + +struct Student { + int age; + char *name; +}; + +int main() { + + // 禁用 stdout 缓冲区 + setbuf(stdout, nullptr); + + struct Student stu1 = {20, "张三"}; + struct Student stu2 = stu1; + + printf("stu1 = %p\n", &stu1); // stu1 = 0x7ffc3f0d2880 + printf("stu2 = %p\n", &stu2); // stu2 = 0x7ffc3f0d2890 + + // 修改结构体变量中成员的值,并不会影响另一个结构体变量中成员的值 + // 因为两个结构体变量都各自独立的 + stu1.age = 21; + stu2.name = "王五"; + + printf("stu1.name = %s\n", stu1.name); // stu1.name = 张三 + printf("stu2.name = %s\n", stu2.name); // stu2.name = 王五 + + return 0; +} +``` + +## 2.6 结构体数组 + + + + + +## 2.7 结构体指针 + + + + + + + + + +## 2.8 结构体在数据结构中的应用 + + + + + + + + + + + + + @@ -1383,4 +1460,12 @@ int main() { +# 第四章:typedef + + + + + + +