2024年10月11日 13:50

This commit is contained in:
许大仙 2024-10-11 05:50:44 +00:00
parent 5f00d7804e
commit a6ef200de0

View File

@ -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 <stdio.h>
#include <string.h>
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