- 结构体的声明
- 结构变量的定义和初始化
- 结构体成员的访问
- 结构体传参
结构体是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。
结构体的声明:
struct tag
{
number-list;
}variable-list;
- 在C语言中要求number-list至少有一个成员变量,而C++允许空结构体;
- variable-list不是必须的。
考虑到兼容性问题,可以使用关键字typedef,假设定义一个学生类:
typedef struct Stu
{
char name[10];
int age;
char sex[3];
int stu_id;
}Stu; //注意分号不能丢
结构变量的定义和初始化结构成员的类型:整型、字符、数组、指针,也可以是其他结构体。
typedef struct Stu
{
char name[10];
int age;
char sex[3];
char stu_id[5];
}Stu; //注意分号不能丢
typedef struct School
{
char name[20];
Stu stu; //结构体的嵌套
}School;
void main()
{
//定义变量的同时进行初始化
Stu stu1 = { "张三", 10, "男", "0324" };
//结构体嵌套的初始化
School sch = { "希望小学", {"李四", 8, "男", "2001"} };
}
结构体成员的访问
- 结构体的成员变量是通过点操作符(.)访问的,例如:
#includetypedef struct Stu { char name[10]; int age; char sex[3]; char stu_id[5]; }Stu; //注意分号不能丢 void print(Stu stu) { printf("name: %snage: %dnsex: %snstu_id: %s", stu.name, stu.age, stu.sex, stu.stu_id); printf("n----------------n"); } void main() { //定义变量的同时进行初始化 Stu stu1 = { "张三", 10, "男", "0324" }; print(stu1); Stu stu2; //stu2.name = "李四"; //这样是错误的 strcpy(stu2.name, "李四"); stu2.age = 19; strcpy(stu2.sex, "男"); strcpy(stu2.stu_id, "0889"); print(stu2); }
- 结构体指针是通过(->)访问结构体的成员变量的,例如:
typedef struct Stu
{
char name[10];
int age;
char sex[3];
char stu_id[5];
}Stu; //注意分号不能丢
void print(Stu *pstu)
{
printf("name: %snage: %dnsex: %snstu_id: %s",
pstu->name, pstu->age, pstu->sex, pstu->stu_id);
printf("n----------------n");
}
void main()
{
//定义变量的同时进行初始化
Stu stu1 = { "张三", 10, "男", "0324" };
Stu* pstu1 = &stu1;
print(pstu1);
Stu stu2;
Stu* pstu2 = &stu2;
strcpy(pstu2->name, "李四");
//当然 (*pstu2).name, 这种方式也可以
//strcpy((*pstu2).name, "李四");
pstu2->age = 19;
strcpy(pstu2->sex, "男");
strcpy(pstu2->stu_id, "0889");
print(pstu2);
}
结构体传参
观察如下代码:
#includetypedef struct Stu { char name[10]; int age; char sex[3]; char stu_id[5]; }Stu; void print1(Stu *pstu) //结构体指针传参 { printf("name: %snage: %dnsex: %snstu_id: %s", pstu->name, pstu->age, pstu->sex, pstu->stu_id); printf("n----------------n"); } void print2(Stu stu) //结构体传参 { printf("name: %snage: %dnsex: %snstu_id: %s", stu.name, stu.age, stu.sex, stu.stu_id); printf("n----------------n"); } void main() { Stu stu1 = { "张三", 10, "男", "0324" }; Stu* pstu1 = &stu1; print1(pstu1); print2(stu1); }
上面的代码中,print1和print2哪个函数好些?
首选是print1函数,原因如下:
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象,因为结构体所占内存较大,参数压栈的系统开销就比较大。而如果是指针传参,指针的大小就是4字节或者8字节,开销较小。



