重回C语言之老兵重装上阵(十)深入浅出结构体
C语言结构体
1. 结构体的基本概念
在 C 语言中,结构体(struct
)是一种聚合数据类型,可以将多个不同类型的数据组合在一起,形成一个新的数据类型。结构体常用于表示具有多个属性的数据。
2. 定义结构体
定义结构体使用关键字 struct
,可以为结构体定义多个成员,每个成员可以是不同的数据类型。
#include <stdio.h>
// 定义一个结构体
struct Person {
char name[50]; // 字符数组,用来存储名字
int age; // 整型变量,用来存储年龄
float height; // 浮点型变量,用来存储身高
};
int main() {
// 创建一个结构体变量
struct Person p1;
// 给结构体成员赋值
snprintf(p1.name, sizeof(p1.name), "Alice");
p1.age = 30;
p1.height = 5.7;
// 打印结构体成员
printf("Name: %s, Age: %d, Height: %.2f\n", p1.name, p1.age, p1.height);
return 0;
}
3. 访问结构体成员
访问结构体成员使用“.
”运算符。
struct Person p1;
p1.age = 25;
printf("Age: %d\n", p1.age);
4. 结构体变量的初始化
结构体变量可以在定义时进行初始化。
struct Person p1 = {"Alice", 30, 5.7}; // 初始化结构体
5. 结构体指针
结构体指针用于指向结构体类型的变量。使用结构体指针时,访问成员要使用“->
”运算符。
struct Person *p2 = &p1;
printf("Name: %s\n", p2->name); // 使用结构体指针访问成员
6. 结构体数组
可以创建结构体类型的数组,每个元素是一个结构体。
struct Person people[3]; // 创建包含 3 个 Person 结构体的数组
// 访问结构体数组中的元素
people[0].age = 25;
7. 嵌套结构体
结构体成员可以是其他结构体类型,这样就可以实现结构体的嵌套。
// 定义一个结构体 Address
struct Address {
char city[50];
char state[50];
};
// 定义一个结构体 Person,其中包含一个 Address 类型的成员
struct Person {
char name[50];
int age;
struct Address addr; // 嵌套结构体
};
int main() {
struct Person p1;
snprintf(p1.name, sizeof(p1.name), "Alice");
p1.age = 30;
snprintf(p1.addr.city, sizeof(p1.addr.city), "New York");
snprintf(p1.addr.state, sizeof(p1.addr.state), "NY");
// 访问嵌套结构体成员
printf("Name: %s, Age: %d, City: %s, State: %s\n", p1.name, p1.age, p1.addr.city, p1.addr.state);
return 0;
}
8. 前向声明
当两个结构体互相嵌套时,我们可以使用前向声明来解决循环依赖的问题。
struct B; // 前向声明结构体 B
struct A {
int x;
struct B *b; // 指向结构体 B 的指针
};
struct B {
int y;
struct A *a; // 指向结构体 A 的指针
};
9. 结构体的大小
结构体的大小受其成员的类型和对齐方式的影响。通过 sizeof
运算符可以获取结构体的大小。
struct Person {
char name[50];
int age;
float height;
};
printf("Size of struct Person: %lu\n", sizeof(struct Person));
10. 结构体传递(按值和按引用)
- 按值传递:函数接收到的是结构体的副本,对结构体的修改不会影响原来的结构体。
void printPerson(struct Person p) {
printf("Name: %s, Age: %d\n", p.name, p.age);
}
- 按引用传递:通过指针传递结构体,可以在函数内修改原结构体的值。
void modifyPerson(struct Person *p) {
p->age = 35;
}
int main() {
struct Person p1 = {"Alice", 30, 5.7};
modifyPerson(&p1); // 修改原结构体
printf("Updated Age: %d\n", p1.age); // 输出修改后的年龄
return 0;
}
11. 结构体与内存
结构体的成员会按照它们在定义中的顺序排列,占用连续的内存空间。结构体的内存布局可能会受到对齐的影响(为了提高性能),这可能会导致内存的填充(padding)。
12. 结构体的比较
C 语言没有内置的结构体比较操作符。要比较两个结构体的内容,需要逐一比较其成员。
int comparePerson(struct Person p1, struct Person p2) {
return (p1.age == p2.age) && (strcmp(p1.name, p2.name) == 0);
}
原文地址:https://blog.csdn.net/m0_73756108/article/details/145232479
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!