一、结构体的定义和结构体变量的定义
1、结构体定义
什么是结构体,结构体是为了方便我们管理一些数据,将一些数据放到一起形成结构体。
如何定义结构体,结构体是一个新的类型,就像int,char,float,short一样
定义一个学生结构体
//定义一个学生结构体
#include<stdio.h>
//结构体必须定义在主函数前面
struct student
{
char name[20];//学生姓名
int age; //学生年龄
int number; //学生学号
};//结构体后面的分号一定不要忘记,缺少会报错
int main()
{
struct student a; //定义一个结构体变量 变量名为a
return 0;
}
2、结构体变量定义及初始化
定义结构体变量就像定义整型变量一样要在前面加上结构体名(struct 结构名)
//以学生结构体为例
struct student a; //定义了一个学生结构体变量,变量名为a
//结构体变量初始化
struct student a={"小王",18,1101};
示例:定义一个学生结构,有学生的姓名,年龄,学号,实现输入,并输出
#include<stdio.h>
//结构体必须定义在主函数前面
struct student
{
char name[20];//学生姓名
int age; //学生年龄
int number; //学生学号
};
int main()
{
struct student a;//定义一个结构体变量
//输入
scanf("%s%d%d",a.name,&a.age,&a.number); //.访问结构体变量
//输出
printf("姓名:%s,年龄:%d,学号:%d\n", a.name, a.age, a.number);
return 0;
}
二、结构体指针
定义一个指针变量,指向结构体变量(以学生结构体为例)
#include<stdio.h>
//结构体必须定义在主函数前面
struct student
{
char name[20];//学生姓名
int age; //学生年龄
int number; //学生学号
};
int main()
{
struct student a;//定义一个结构体变量
//定义一个结构体指针
struct student* p = &a;
//通过结构体指针输入学生信息
scanf("%s%d%d", p->name, &p->age, &p->number);
//通过结构体指针输出
printf("姓名:%s,年龄:%d,学号:%d\n", p->name, p->age, p->number);
//通过printf输出
printf("姓名:%s,年龄:%d,学号:%d\n", a.name, a.age, a.number);
return 0;
}
| 成员运算符 | 算法 | 左值 | 右值 |
| ---------- | ---------------------------------- | ---------- | -------- |
| . | 运算得到结构体变量中的成员对象本身 | 结构体变量 | 成员名称 |
| -> | 运算得到结构体变量中的成员对象本身 | 结构体指针 | 成员名称 |
三、结构体做函数参数
1、值传递
#include<stdio.h>
//结构体必须定义在主函数前面
struct student
{
char name[20];//学生姓名
int age; //学生年龄
int number; //学生学号
};
//函数声明
void print_student(struct student a);
int main()
{
struct student a;//定义一个结构体变量
//定义一个结构体指针
struct student* p = &a;
//通过结构体指针输入学生信息
scanf("%s%d%d", p->name, &p->age, &p->number);
//调用函数
print_student(a);
return 0;
}
//输出学生信息函数
void print_student(struct student w)//值传递
{
printf("姓名:%s,年龄:%d,学号:%d\n", w.name, w.age, w.number);
}
2、地址传递
#include<stdio.h>
//结构体必须定义在主函数前面
struct student
{
char name[20];//学生姓名
int age; //学生年龄
int number; //学生学号
};
//函数声明
void print_student(struct student* w);
int main()
{
struct student a;//定义一个结构体变量
//定义一个结构体指针
struct student* p = &a;
//通过结构体指针输入学生信息
scanf("%s%d%d", p->name, &p->age, &p->number);
//调用函数
print_student(p);
return 0;
}
//输出学生信息函数
void print_student(struct student* w)//地址传递
{
printf("姓名:%s,年龄:%d,学号:%d\n", w->name, w->age, w->number);
}
四、结构体数组
直接用题来理解
定义一个学生结构体,定义一个学生结构体数组,定义一个set_in()函数实现输入学生信息,定义一个print_all()函数实现输出所有学生信息,定义一个age_25()函数判断年龄大于25岁的学生并输出学生的信息。
#include<stdio.h>
struct student
{
char name[20];//学生姓名
int age; //学生年龄
int number; //学生学号
};
//函数声明
void set_in(struct student* p, int n);
void print_all(struct student* p, int n);
void age_25(struct student* p, int n);
void print_student(struct student* p);
int main()
{
//定义结构体数组
struct student s[3];
//调用函数
//输入
set_in(s, 3);
//输出所有学生信息
print_all(s, 3);
printf("25岁以上学生的信息\n");
//找到25岁以上的学生并输出
age_25(s, 3);
return 0;
}
//实现输入学生信息的函数set_in
void set_in(struct student* p, int n)
{
int i = 0;
for (i = 0; i < 3; i++)
{
scanf("%s%d%d", p[i].name,& p[i].age,& p[i].number);
}
}
//实现输出所有学生信息的函数print_all
void print_all(struct student* p, int n)
{
int i = 0;
for (i = 0; i < 3; i++)
{
printf("姓名:%s,年龄:%d,学号:%d\n", p[i].name, p[i].age, p[i].number);
}
}
//实现找到年龄大于25岁的学生并输出学生的信息
void age_25(struct student* p, int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
if (p[i].age > 25)
{
print_student(&p[i]);
}
}
}
//实现输出学生的信息
void print_student(struct student * p)
{
printf("姓名:%s,年龄:%d,学号:%d\n", p->name, p->age, p->number);
}