1.什么是结构体?
结构体是由一系列具有相同或不同类型的数据构成的数据集合。由于生活中的事物信息是复杂的,比如我们定义一个学生,需要知道ta的姓名,年龄,学号等等,结构体恰好能解决这个问题。
2.结构体的声明
//结构体的声明
//结构体关键字(struct)+结构体标签+花括号{ 成员数据类型+成员名 };
struct student
{
char name[10];//声明姓名
int age;//声明年龄
char id[20];//声明学号
};
//结构体关键字-struct 结构体标签-student 结构体类型-struct student
另一种声明方式
typedef struct student
{
char name[10];//声明姓名
int age;//声明年龄
char id[20];//声明学号
}stu;
//在原结构体类型前加typedef,在花括号与最后一个分号之间加上你想要的结构体类型缩写
//这种声明相当于重置结构体类型的名称并且通常有简化作用
声明的注意:
👍
//声明的注意:
1.结构体的声明在使用之前
2.在任何函数之外声明的结构体作用于整个程序
3.在函数内部声明的结构体只能作用于这个函数内部
3.结构体的定义
结构体的定义不少于1种,这里只讲最标准的一种
struct student
{
char name[10];//声明姓名
int age;//声明年龄
char id[20];//声明学号
};
int main()
{
struct student s1 = { "张三", 18, "19990722" };
//结构体类型+结构体变量名+=+花括号{ 各成员数据 };
//各成员数据之间用,隔开
//结构体定义各成员数据的顺序应与声明时一致
return 0;
}
或者
struct student
{
char name[10];//声明姓名
int age;//声明年龄
char id[20];//声明学号
}stu;
int main()
{
stu s1 = { "张三", 18, "19990722" };
//结构体类型+结构体变量名+=+花括号{ 各成员数据 };
//各成员数据之间用,隔开
//结构体定义各成员数据的顺序应与声明时一致
return 0;
}
结构体变量=结构体类型+变量名
stu s1 = stu + s1
类比以下
整形变量=整数类型+变量名
int a= int + a
4.结构体成员的访问
struct student
{
char name[10];//声明姓名
int age;//声明年龄
char id[20];//声明学号
};
int main()
{
struct student stu = { "张三", 18, "19990722" };
printf("%s %d %s", stu.name, stu.age, stu.id);
//结构体变量名.成员名
//相当于打印字符串,整形数据,字符串
return 0;
}
利用指针访问结构体变量
typedef struct student
{
char name[10];//声明姓名
int age;//声明年龄
char id[20];//声明学号
}stu;
int main()
{
stu s1= { "张三", 18, "19990722" };
stu*ps = &s1;
//定义了一个所指向类型为结构体类型的指针ps
printf("%s %d %s", ps->name, ps->age, ps->name);
//指针加->成员名即可
//ps->name相当于利用指针访问结构体中的name数据
return 0;
}
5.结构体的嵌套使用
typedef struct more_information
{
char hobby[20];
char favorite_food[10];
}mi;
typedef struct student
{
char name[10];//声明姓名
int age;//声明年龄
char id[20];//声明学号
mi m1;
//stu内部有结构体时,应写上此结构体类型加上结构体变量名
}stu;
int main()
{
stu s1 = { "张三", 18, "19990722", { "篮球", "牛肉" } };
printf("%s %d %s %s %s", s1.name, s1.age, s1.id, s1.m1.hobby, s1.m1.favorite_food);
//访问结构体中的结构体的数据时用 一级结构体变量1名.二级结构体变量名.成员名
//三级依次类推
stu*ps = &s1;
printf("\n");
printf("%s %d %s %s %s",ps->name, ps->age, ps->id, ps->m1.hobby, ps->m1.favorite_food);
//用一级结构体的指针访问其内容中的二级结构体加 . 成员名
return 0;
}
6.结构体传址
typedef struct student
{
char name[10];//声明姓名
int age;//声明年龄
char id[20];//声明学号
}stu;
void print(stu tmp)
//由于形参tmp只是实参的一份临时拷贝
//所以在传参时,系统要额外为形参开辟空间
//如果实参特别大,这样会降低程序运行效率
{
printf("%s\n", tmp.name);
printf("%d\n", tmp.age);
printf("%s\n", tmp.id);
}
int main()
{
stu s1 = { "张三", 18, "19990722" };
//stu*ps = &s1;
print(s1);
return 0;
}
typedef struct student
{
char name[10];//声明姓名
int age;//声明年龄
char id[20];//声明学号
}stu;
void print(stu*ps)
//这里将结构体s1的地址传给print,由于地址只占四个字节,所以可以节省空间,提高效率
{
printf("%s\n", ps->name);
printf("%d\n", ps->age);
printf("%s\n", ps->id);
}
int main()
{
stu s1 = { "张三", 18, "19990722" };
stu*ps = &s1;
print(ps);
return 0;
}
虽然两个程序个结果相同,但是很明显结构体传址的效率更高
7.说明
此博客出自c语言初学者之手,自然适合初学者阅读,若有不妥之处,恭请大家指正!另外,希望大家帮忙点赞,你们的善举将是我学习最大的动力。同时也祝各位学习进步!