C语言结构体是一种用户自定义的复合数据类型,允许将不同类型的数据组合成一个整体,方便对一组相关联的数据进行统一管理,比如可以用结构体来表示一个学生的基本信息,包含姓名、年龄、成绩等不同字段。
C语言结构体的基本定义语法
定义结构体需要使用struct关键字,基本语法格式如下:
struct 结构体名 {
数据类型 成员1;
数据类型 成员2;
// 更多成员
};
比如我们要定义一个表示学生信息的结构体,代码如下:
struct Student {
char name[20]; // 学生姓名
int age; // 学生年龄
float score; // 学生成绩
};
这里定义了一个名为Student的结构体,包含三个成员,分别是字符数组类型的姓名、整型的年龄和浮点型的成绩。
结构体变量的定义方式
定义好结构体类型之后,就可以创建对应的结构体变量,常见的有两种方式:
1. 先定义结构体类型,再定义变量
这种方式是先完成结构体的类型定义,之后再用类型名创建变量:
struct Student {
char name[20];
int age;
float score;
};
// 定义两个Student类型的结构体变量
struct Student stu1;
struct Student stu2;
2. 定义结构体类型的同时定义变量
也可以在定义结构体的大括号后面直接跟上变量名,创建对应的变量:
struct Student {
char name[20];
int age;
float score;
} stu1, stu2; // 同时定义stu1和stu2两个变量
结构体变量的初始化方法
结构体变量可以在定义的时候进行初始化,常见的初始化方式有以下几种:
1. 按顺序初始化
按照结构体成员的定义顺序,依次给每个成员赋值:
struct Student {
char name[20];
int age;
float score;
};
// 按顺序初始化,name对应第一个成员,age对应第二个,score对应第三个
struct Student stu1 = {"张三", 18, 92.5};
2. 指定成员初始化
C99标准支持指定成员初始化,不需要按照顺序,直接指定成员名赋值即可:
struct Student {
char name[20];
int age;
float score;
};
// 指定成员初始化,顺序可以打乱
struct Student stu2 = {.score = 88.0, .name = "李四", .age = 19};
结构体成员的访问方式
访问结构体成员需要使用点运算符.,语法格式为结构体变量名.成员名,下面是完整的访问示例:
#include <stdio.h>
#include <string.h>
struct Student {
char name[20];
int age;
float score;
};
int main() {
// 定义并初始化结构体变量
struct Student stu = {"王五", 20, 95.0};
// 访问结构体成员并输出
printf("姓名:%sn", stu.name);
printf("年龄:%dn", stu.age);
printf("成绩:%.1fn", stu.score);
// 修改结构体成员的值
strcpy(stu.name, "赵六");
stu.age = 21;
stu.score = 96.5;
printf("修改后姓名:%sn", stu.name);
printf("修改后年龄:%dn", stu.age);
printf("修改后成绩:%.1fn", stu.score);
return 0;
}
结构体指针的使用
如果是指向结构体的指针变量,访问成员需要使用箭头运算符->,示例如下:
#include <stdio.h>
struct Student {
char name[20];
int age;
float score;
};
int main() {
struct Student stu = {"孙七", 22, 90.0};
// 定义结构体指针并指向stu
struct Student *p = &stu;
// 通过指针访问结构体成员
printf("姓名:%sn", p->name);
printf("年龄:%dn", p->age);
printf("成绩:%.1fn", p->score);
return 0;
}
结构体类型重命名
可以使用typedef关键字给结构体类型起一个别名,之后定义变量的时候就不需要再写struct关键字了:
#include <stdio.h>
// 给struct Student起别名为Student
typedef struct Student {
char name[20];
int age;
float score;
} Student;
int main() {
// 直接用别名定义变量,不需要加struct
Student stu = {"周八", 23, 89.0};
printf("姓名:%s,年龄:%d,成绩:%.1fn", stu.name, stu.age, stu.score);
return 0;
}