54-1 基础知识
结构是一些值的集合,这些值成为成员变量。结构的每个成员可以是不同类型的变量。
内置类型:
char
short
int
long long
float
double
复杂对象:
人:名字+电话+性别+身高
书:书名+作者+定价+书号
复杂对象的描述就会用到结构体。
54-2 结构体的语法形式
struct tag
{
member-list
}variable-list;
举例:
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
}p1,p2; //此时p1、p2是全局的结构体变量,不建议
54-3 结构体变量的创建
struct Peo //声明结构体类型,只是个模版,不占用内存空间
{
char name[20];
char tele[12];
char sex[5];
int high;
};
int main()
{
struct Peo p1 = { 0 }; //创建结构体变量,向内存申请空间
return 0;
}
54-4 结构体成员的类型
可以是标量、数组、指针,甚至是其他结构体
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
};
struct Stu
{
struct Peo p;
int num;
float f;
};
54-5 结构体变量的初始化
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
};
struct Stu
{
struct Peo p;
int num;
float f;
};
int main()
{
struct Peo p1 = { "张三","16529232121","男",181 };
struct Stu p2 = { {"李四","16529232123","女",170},100,3.14f};
return 0;
}
打印:
代码:
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
};
struct Stu
{
struct Peo p;
int num;
float f;
};
int main()
{
struct Peo p1 = { "张三","16529232121","男",181 };
struct Stu p2 = { {"李四","16529232123","女",170},100,3.14f };
printf("%s %s %s %d\n", p1.name, p1.tele, p1.sex, p1.high);
printf("%s %s %s %d %d %f\n", p2.p.name, p2.p.tele, p2.p.sex, p2.p.high,p2.num ,p2.f );
return 0;
}
结果:
54-6 结构体成员的访问
.与->操作符
代码:
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
};
struct Stu
{
struct Peo p;
int num;
float f;
};
void print1(struct Peo p1)
{
printf("%s %s %s %d\n", p1.name, p1.tele, p1.sex, p1.high); //结构体变量.成员变量
}
void print2(struct Peo* p1)
{
printf("%s %s %s %d\n", p1->name, p1->tele, p1->sex, p1->high); //结构体指针->成员变量
}
int main()
{
struct Peo p1 = { "张三","16529232121","男",181 };
print1(p1);
print2(&p1);
return 0;
}
结果:
54-7 结构体传参
问:54-6中的print1和print2函数哪个好些?
答案:首选print2函数
原因:函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降
结论:结构体传参的时候,要传结构体的地址