- 1. 结构体的声明
- 1.1 结构的基本知识
- 1.2 结构体声明
- 1.3 结构成员的类型
- 1.4 结构体变量的定义和初始化
- 2. 结构体成员的访问
- 3. 结构体传参
结构是一些值的基本集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。
1.2 结构体声明结构体关键字 结构体标签(随意)
struct tag
{
member-list;
成员列表
}variable-list;
变量列表
举例,定义人这个类型:
//声明的结构体类型
struct Peo
{
char name[20];
char tele[12];
char sez[5];
int height;
}p1, p2;
这里的p1和p2是通过struct Peo结构体类型创建的两个变量,并且是全局结构体变量。建议少用全局的变量,因此可以改成下面这种在主函数内部创建的方法:
struct Peo
{
char name[20];
char tele[12];
char sez[5];
int height;
};
int main()
{
struct Peo p1 = { 0 } ;
//结构体变量的创建
//有了类型,就可以通过类型来创建变量
return 0;
}
//可以在主函数内部定义结构体,但没意义
1.3 结构成员的类型
可以是标量(int float double…),数组,指针,甚至是其它结构体。
1.4 结构体变量的定义和初始化结构体可以嵌套:
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int height;
}p2, p3;
struct Peo p4, p5;
//这里p2-p5都是全局结构体变量
struct St
{
//在St里嵌套一个结构体变量
struct Peo p;
int num;
};
int main()
{
//给p1初始化
struct Peo p1 = { "张三", "19816288003", "男", 185 };
//s是结构体变量,里面还有结构体变量p,需要两个大括号
//内部大括号初始化p,外部初始化s
struct St s = { {"lisi","11111111111","girl",165},100 };
//打印结构体成员
printf("%s %s %s %dn", p1.name, p1.tele, p1.sex, p1.height);
printf("%s %s %s %d %dn", s.p.name, s.p.tele, s.p.sex, s.p.height, s.num);
return 0;
}
2. 结构体成员的访问
上面打印成员变量用到的是.操作符,下来用->操作符来操作。
使用箭头操作符,必须是指针变量。首先需要取出p1变量的地址,封装一个打印函数,把&p1作为实参传过去,形参就需要一个结构体指针来接收,然后利用箭头找到每个成员名并打印:
void print(struct Peo* p)
{
printf("%s %s %s %dn", p->name, p->tele, p->sex, p->height);
}
int main()
{
//给p1初始化
struct Peo p1 = { "张三", "19816288003", "男", 185 };
//s是结构体变量,里面还有结构体变量p,需要两个大括号
//内部大括号初始化p,外部初始化s
struct St s = { {"lisi","11111111111","girl",165},100 };
print(&p1);
return 0;
}
3. 结构体传参
上面两种传参方式都可以打印出相同的信息,那么有什么区别,哪种方法最好?
答案是:首选print2函数。
函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
结构体传参的时候,要传结构体的地址。



