前言
在生活中,我们通常从不同的方面收集或者描述人、事、物的信息,例如收集一个学生的信息,需要包括学号、姓名、性别、年龄;描述一本书的信息,需要包括书号、书名、价格等。那我们有没有可能在程序中描述这些信息呢?在本章将和大家一起认识一个新朋友—结构体,并希望大家了解他的特性!
1.结构体的声明
1.1结构体的基础知识
数组—一组相同类型的元素的集合。
结构体是一些值的集合,这些值成为成员变量。结构的每个成员可以是不同类型的集合。
1.2结构的声明
struct tag//tag是结构名,是可以根据需求改变的
{
member - list;//成员列表1~N
}variable-list;//结构体变量1~N
例如描述一个学生的结构体:
typedef struct Stu
{
char no[10];//学号
char name[20];//姓名
char sex[10];//性别
int age;//年龄
}Stu;
typedef是C语言的关键字,作用是为一种数据类型更改新名称,包括C语言自带的数据类型(如int、char等)和自定义的数据类型(如结构体类型等)。
1.3结构体成员的类型
结构体的成员可以是变量、数组、指针,甚至可以是其他结构体。
1.4结构体变量的定义和初始化
//①先声明结构类型,再定义结构变量
struct Stu
{
char no[10];//学号
char name[20];//姓名
char sex[10];//性别
int age;//年龄
};
struct Stu s1;//定义结构体变量
s1 = { "00001","zhangsan","nan",20 };//初始化
//②声明结构类型的同时定义结构体变量
struct Stu
{
char no[10];//学号
char name[20];//姓名
char sex[10];//性别
int age;//年龄
}s2;
s2 = { "00002","lisi","nan",21 };//初始化
//③直接定义结构变量
struct
{
char no[10];//学号
char name[20];//姓名
char sex[10];//性别
int age;//年龄
}s3;//一般不建议这样写
s3 = { "00003","wangwu","nan",22 };//初始化
//由于省去了结构名,再该定义语句后面无法再定义
//这个类型的其他结构体变量;除非加上结构名或者
//再次直接定义结构变量
//④结构体嵌套初始化
struct Point
{
char no[10];//学号
char name[20];//姓名
};
struct Stu
{
struct Point p;//结构体
char sex[10];//性别
int age;//年龄
}p1;
p1 = { {"00007","liuliu"},"baomi",18 };
//⑤结构体全局变量与结构体局部变量
struct Stu
{
char name[20];
int age;
}s1;//结构体全局变量
#include<stdio.h>
int main()
{
struct Stu s2;//结构体局部变量
return 0;
}
2.结构体成员的访问
- 结构体变量访问成员,结构体变量是通过操作符(.)。点操作符接收两个操作数。
eg1:
#include<stdio.h>
struct Stu
{
char name[20];
int age;
};
int main()
{
struct Stu s;
strcpy(s.name, "zhangsan");
s.age = 20;
printf("%s %d\n", s.name, s.age);
return 0;
}
图形理解:
代码运行结果:
结构体指针指向变量的成员:
eg2:
struct Stu
{
char name[20];
int age;
};
void Print(struct Stu* p)//用结构体指针接收
{
printf("name=%s age=%d\n", (*p).name, (*p).age);
//使用结构体指针访问指向对象的成员
printf("name=%s age%d\n", p->name,p->age);
}
#include<stdio.h>
int main()
{
struct Stu s = { "zhansan",20 };
Print(&s);//把结构体变量的地址传过去
return 0;
}
代码运行的结果:
总结:
//结构体数组:struct 结构名 数组名
//使用方式:
//①结构体数组名[下标].成员名
//②(*(结构数组名+下标)).成员名
//③(结构数组名+下标)->成员名
//结构体指针:struct 结构名 *指针变量名
//使用方式:
//①结构指针变量名.成员名
//②(*结构指针变量名).成员名
//③结构指针变量名->成员名
3.结构体传参
eg:
struct Stu
{
char name[20];
int age;
};
void Print1(struct Stu s)
{
printf("name=%s age%d\n", s.name,s.age);
}
void Print2(struct Stu* p)//用结构体指针接收
{
//使用结构体指针访问指向对象的成员
printf("name=%s age%d\n", p->name,p->age);
}
#include<stdio.h>
int main()
{
struct Stu s = { "zhansan",20 };
Print1(s);//传结构体--传值调用
Print2(&s);//把结构体变量的地址传过去--传址调用
return 0;
}
代码运行的结果:
上面的代码中Print1和Print2函数哪个好些呢?
答案是:首选Print2函数。
原因:函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数的压栈的系统开销比较大,所以会导致性能的下降。
结论: 结构体传参的时候,要传结构体的地址。
总结
本章我们一起学习了
1.结构体的声明、定义及初始化
2.结构体成员的访问
3.结构体的传参
希望对大家了解结构体特性 有些许帮助,相信有了结构体这个好朋友的帮助,在学习C语言的道路上会轻松不少!最后感谢大家阅读,如有不对,欢迎纠正噢!