特点:可定义多种数据类型
描述:从定义和结合上来进行说明
一般形式:struct 结构体名
{ 成员列表 } 变量列表 ;
定义+声明+初始化
// 结构体声明 + 定义 + 初始化
struct Student {
char name[69];
char sex;
struct Date brithday;
char address[90];
}student1 = {"LiMing", 'M', 2018, 10, 02, "123Beijing"};
void test01() {
void show_test01(struct Student student) ;
struct Student student2 = {"Dave", 'F', 2017, 01, 01, "GuangXi"}; // 先声明,后定义+初始化
struct Student student3; // 先声明,再定义,后逐个初始化
strcpy(student3.name, "Danay");
student3.sex = 'M';
student3.brithday.year = 2016;
student3.brithday.month = 02;
student3.brithday.day = 02;
strcpy(student3.address, "HuNan");
// 变量初始化
// 冒号初始化
show_test01(student1) ;
show_test01(student2) ;
show_test01(student3) ;
}
void show_test01(struct Student student) {
printf("%s,%c,%d,%d,%d,%s\n",student.name, student.sex, student.brithday.year, student.brithday.month, student.brithday.day, student.address);
}
结构体+组合
结构体+数组排序(选择法)
// 结构体数组排序(选择法)
void test02() {
void show_test01(struct Student student);
struct Student student[10] = {
{"Dave", 'F', 2017, 01, 01, "GuangXi"},
{"Array", 'F', 2015, 01, 01, "GuangDong"},
{"Snow", 'M', 2017, 01, 01, "GuangXi"},
{"Ned", 'N', 2010, 01, 01, "GuangXi"},
{"Sansa", 'F', 2014, 01, 01, "GuangXi"}};
int row, row1;
struct Student temp;
const int n = 10;
for(row = 0; row < n; row++)
for(row1 = row; row1 < n; row1++)
if(strcmp(student[row].name, student[row1].name))
temp = student[row], student[row] = student[row1], student[row] = temp;
for(row = 0; row < n; row++) show_test01(student[row]);
}
结构体数组+指针法调用
// 结构体指针
void test03() {
struct Student student2 = {"Dave", 'F', 2017, 01, 01, "GuangXi"};
struct Student student[10] = {
{"Dave", 'F', 2017, 01, 01, "GuangXi"},
{"Array", 'F', 2015, 01, 01, "GuangDong"}};
struct Student *stu1, *stu2;
stu1 = &student2;
printf("%s,%c,%d\n",student2.name, (*stu1).sex, stu1->brithday.year); // 一维结构体的调用
for(stu2 = student; stu2 < student + 10; stu2++)
printf("%s,%c,%d\n",stu2->name, stu2->sex, stu2->brithday.year); // 二维结构体的调用
}
结构体变量+结构体的变量的指针-->函数形参
struct Student1 {
int num;
char name[90];
int score[3];
int aver;
};
// 结构体变量和结构体的变量的指针作为函数参数
void test04() {
void test04_creat(struct Student1 stu[], int n);
struct Student1 test04_max(struct Student1 stu[], int n);
void test04_print(struct Student1 stu);
struct Student1 stu[N], *p=stu;
test04_creat(p, N);
test04_print(test04_max(p, N));
}
void test04_print(struct Student1 stu) {
printf("成绩最高的学生学号和姓名为:%d, %s\n", stu.num, stu.name);
printf("平均成绩为:%d, 三门成绩分别为:%d, %d, %d\n",stu.aver, stu.score[0], stu.score[1], stu.score[2]);
}
struct Student1 test04_max(struct Student1 stu[], int n) {
int i, j;
int maxScore = 0, flag = -1;
for(i = 0; i < n; i++)
if(stu[i].aver > maxScore)
flag = i;
printf("%d\n",flag);
return stu[flag];
}
void test04_creat(struct Student1 stu[], int n) {
int i, j;
int sumScore = 0;
for(i = 0; i < n; i++) {
stu[i].num = i;
strcpy(stu[i].name, "ii");
for( j = 0, sumScore = 0; j < 3; j++) {
stu[i].score[j] = i * 1 + j * 30;
sumScore += stu[i].score[j];
}
stu[i].aver = (sumScore / 3);
printf("stu[%d].aver:%d,%s,%d,%d,%d,%d\n",i, stu[i].num, stu[i].name, stu[i].score[0],
stu[i].score[1], stu[i].score[2], stu[i].aver);
}
}
以上写的是结构体的定义和结合使用(数组+指针+函数[形参])。