结构体是C语言中一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个逻辑上的整体。结构体非常适合用来表示复杂的数据结构,例如学生信息、员工记录、几何图形等。
1.结构体的定义
结构体的定义使用 struct 关键字,语法如下:
struct 结构体名 {
数据类型 成员1;
数据类型 成员2;
...
数据类型 成员N;
};
示例:定义一个表示学生信息的结构体
struct Student {
int id; // 学号
char name[50]; // 姓名
float score; // 成绩
};
2.结构体变量的声明
定义结构体后,可以声明结构体变量。声明方式有两种:
(1)直接声明
struct Student {
int id;
char name[50];
float score;
} student1, student2; // 直接声明两个结构体变量
(2)先定义结构体,再声明变量
struct Student {
int id;
char name[50];
float score;
};
struct Student student1, student2; // 声明结构体变量
3.结构体成员的访问
结构体成员通过点运算符(.)访问。
示例:
#include
struct Student {
int id;
char name[50];
float score;
};
int main() {
struct Student student1;
// 赋值
student1.id = 1;
strcpy(student1.name, "Alice");
student1.score = 95.5;
// 访问
printf("学号: %d\n", student1.id);
printf("姓名: %s\n", student1.name);
printf("成绩: %.2f\n", student1.score);
return 0;
}
输出:
学号: 1
姓名: Alice
成绩: 95.50
4.结构体数组
结构体数组用于存储多个结构体变量。
示例:
#include
struct Student {
int id;
char name[50];
float score;
};
int main() {
struct Student students[3]; // 定义结构体数组
// 赋值
for (int i = 0; i < 3; i++) {
printf("输入第 %d 个学生的信息:\n", i + 1);
printf("学号: ");
scanf("%d", &students[i].id);
printf("姓名: ");
scanf("%s", students[i].name);
printf("成绩: ");
scanf("%f", &students[i].score);
}
// 输出
printf("\n学生信息:\n");
for (int i = 0; i < 3; i++) {
printf("学号: %d, 姓名: %s, 成绩: %.2f\n",
students[i].id, students[i].name, students[i].score);
}
return 0;
}
5.结构体指针
结构体指针用于动态操作结构体变量。
示例:
#include
#include
struct Student {
int id;
char name[50];
float score;
};
int main() {
struct Student *studentPtr;
// 动态分配内存
studentPtr = (struct Student *)malloc(sizeof(struct Student));
// 赋值
studentPtr->id = 1;
strcpy(studentPtr->name, "Bob");
studentPtr->score = 88.5;
// 访问
printf("学号: %d\n", studentPtr->id);
printf("姓名: %s\n", studentPtr->name);
printf("成绩: %.2f\n", studentPtr->score);
// 释放内存
free(studentPtr);
return 0;
}
注意:
- 使用 -> 运算符访问结构体指针的成员。
- 动态分配内存后,记得使用 free 释放内存。
6.结构体嵌套
结构体可以嵌套其他结构体,用于表示更复杂的数据结构。
示例:
#include
struct Date {
int year;
int month;
int day;
};
struct Student {
int id;
char name[50];
struct Date birthday; // 嵌套结构体
};
int main() {
struct Student student1;
// 赋值
student1.id = 1;
strcpy(student1.name, "Charlie");
student1.birthday.year = 2000;
student1.birthday.month = 10;
student1.birthday.day = 15;
// 访问
printf("学号: %d\n", student1.id);
printf("姓名: %s\n", student1.name);
printf("生日: %d-%02d-%02d\n",
student1.birthday.year,
student1.birthday.month,
student1.birthday.day);
return 0;
}
7.结构体与函数
结构体可以作为函数的参数或返回值。
示例:
#include
struct Point {
int x;
int y;
};
// 函数:打印点的坐标
void printPoint(struct Point p) {
printf("(%d, %d)\n", p.x, p.y);
}
// 函数:返回一个点
struct Point createPoint(int x, int y) {
struct Point p;
p.x = x;
p.y = y;
return p;
}
int main() {
struct Point p1 = createPoint(3, 4);
printPoint(p1); // 输出: (3, 4)
return 0;
}
8.结构体的对齐与大小
结构体的大小受内存对齐规则影响。可以使用 sizeof 运算符查看结构体的大小。
示例:
#include
struct Example {
char a;
int b;
double c;
};
int main() {
printf("结构体大小: %lu 字节\n", sizeof(struct Example));
return 0;
}
输出:
结构体大小: 16 字节
总结
结构体是C语言中非常重要的数据类型,用于将不同类型的数据组合在一起。通过结构体,可以更清晰地表示复杂的数据结构,并提高代码的可读性和可维护性。掌握结构体的定义、访问、嵌套、指针操作以及与函数的结合使用,是C语言编程的基础之一。