C语言是一种高效、简洁、灵活的编程语言,被广泛应用于操作系统、编译器、数据库、游戏等领域。在C语言中,结构体是一种重要的数据类型,它可以将不同类型的数据组合成一个整体,方便程序员进行处理和管理。本文将从多个角度分析C语言编程中的结构体,包括定义、初始化、访问、内存布局、传递等方面。
一、定义结构体

在C语言中,结构体是一种复合数据类型,由多个成员变量组成。定义结构体的语法如下:
```
struct 结构体名称 {
成员变量类型1 成员变量名称1;
成员变量类型2 成员变量名称2;
……
};
```
例如,定义一个学生信息的结构体:
```
struct Student {
char name[20];
int age;
float score;
};
```
二、初始化结构体
结构体定义完成后,可以通过以下方式初始化结构体变量:
```
struct Student stu = {"Tom", 18, 90.5};
```
或者逐个初始化成员变量:
```
struct Student stu;
strcpy(stu.name, "Tom");
stu.age = 18;
stu.score = 90.5;
```
三、访问结构体成员
访问结构体成员时,可以使用点运算符(.)或箭头运算符(->)。
点运算符用于访问结构体变量的成员,如:
```
printf("Name: %s\n", stu.name);
printf("Age: %d\n", stu.age);
printf("Score: %.2f\n", stu.score);
```
箭头运算符用于访问结构体指针变量的成员,如:
```
struct Student *p = &stu;
printf("Name: %s\n", p->name);
printf("Age: %d\n", p->age);
printf("Score: %.2f\n", p->score);
```
四、内存布局
结构体在内存中的布局是连续的,即结构体变量的地址等于第一个成员变量的地址。例如,下面的代码可以验证结构体大小和成员变量的偏移量:
```
struct Student {
char name[20];
int age;
float score;
};
int main() {
printf("Sizeof(Student) = %d\n", sizeof(struct Student));
printf("Offsetof(name) = %d\n", offsetof(struct Student, name));
printf("Offsetof(age) = %d\n", offsetof(struct Student, age));
printf("Offsetof(score) = %d\n", offsetof(struct Student, score));
return 0;
}
```
五、传递结构体
在函数调用中,可以将结构体变量作为参数传递给函数,也可以将结构体指针变量作为参数传递给函数。
```
void printStudent(struct Student stu) {
printf("Name: %s\n", stu.name);
printf("Age: %d\n", stu.age);
printf("Score: %.2f\n", stu.score);
}
void modifyStudent(struct Student *p) {
strcpy(p->name, "Jerry");
p->age = 19;
p->score = 88.5;
}
int main() {
struct Student stu = {"Tom", 18, 90.5};
printStudent(stu);
modifyStudent(&stu);
printStudent(stu);
return 0;
}
```
六、结构体的高级用法
除了上述基本用法外,结构体还有很多高级用法,如结构体嵌套、匿名结构体、位域等。这些用法超出了本文的范围,读者可以自行学习。