C语言结构体学习笔记
1、什么是结构体
结构体是一种用户自定义的数据类型,用于将不同类型的数据组合成一个有机整体。
例如,一个学生可以包含以下属性:
int num;
char name[20];
char sex;
int age;
char addr[30];
这些属性可以通过结构体统一管理。
2、结构体声明和定义
2.1 声明模板
struct student_t {
char name[25];
int age;
int number;
};
student_t
是结构体的类型名,不是变量名。此时并未分配内存,只有声明模板。
2.2 定义变量
可以通过以下方式定义变量:
struct student_t student1, student2;
也可以在声明结构体的同时定义变量:
struct student_t {
char name[25];
int age;
int number;
} student1, student2;
3、结构体变量初始化
结构体变量可以在声明时初始化:
struct employee {
int id;
char name[20];
} emp1 = {1, "Alice"}, emp2 = {2, "Bob"};
注意:未初始化的成员会保留默认值。
4、访问结构体成员
通过 .
运算符 访问结构体成员:
printf("Name: %s\n", emp1.name);
printf("ID: %d\n", emp1.id);
5、sizeof 运算符
可以使用 sizeof
运算符查看结构体的内存大小:
struct test {
int num1;
char ch;
int num2;
};
printf("Size of struct: %zu\n", sizeof(struct test));
注意:结构体的大小受 内存对齐 的影响。
6、结构体嵌套
结构体可以嵌套使用:
struct book {
char title[30];
char author[20];
float price;
};
struct borrower {
int id;
char name[20];
struct book borrowed_book;
} borrower1 = {1, "John", {"C Programming", "Dennis Ritchie", 30.0}};
访问嵌套结构体成员:
printf("Borrower: %s\n", borrower1.name);
printf("Book Title: %s\n", borrower1.borrowed_book.title);
7、结构体数组
结构体可以作为数组元素:
struct student_t students[3] = {
{"Alice", 20, 1001},
{"Bob", 21, 1002},
{"Charlie", 19, 1003}
};
访问数组成员:
printf("Student Name: %s\n", students[1].name);
8、结构体作为函数参数和返回值
8.1 作为参数
默认是 按值传递:
void printStudent(struct student_t student) {
printf("Name: %s, Age: %d\n", student.name, student.age);
}
8.2 作为返回值
struct student_t createStudent() {
struct student_t student = {"Diana", 22, 1004};
return student;
}
9、typedef 关键字
使用 typedef
为结构体定义新名字:
typedef struct student_t {
char name[25];
int age;
int number;
} Student;
Student student1 = {"Eve", 23, 1005};
10、示例代码:学生信息管理
#include <stdio.h>
#include <string.h>
struct student {
int id;
char name[20];
int age;
};
void printStudent(struct student s) {
printf("ID: %d, Name: %s, Age: %d\n", s.id, s.name, s.age);
}
int main() {
struct student s1 = {1, "Alice", 20};
struct student s2;
s2.id = 2;
strcpy(s2.name, "Bob");
s2.age = 21;
printStudent(s1);
printStudent(s2);
return 0;
}