结构体类型的声明
用结构体描述对象时,结构体中包含了一些值,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。 ::: tip 结构声明:
struct tag
{
member-list;
}variable-list;
struct:结构体关键字。 tag:结构体标签。(tag可以根据使用场景随意替换) struct-tag合称结构体类型。 member-list:成员列表,即结构体中的值的集合。 variable-list:变量列表。 ::: 定义一个学生结构体类型:
struct Stu //结构体类型创建
{
char name[20];
char sex[5];
short age;
char tel[12];
}s1,s2,s3; //
描述学生的一些数据如姓名等写在struct中,即成员变量。 ::: tip 结构体声明是一条语句,在声明结束时,在大括号后面加上分号做结尾。 结构体声明(创建)时不占据内存空间,使用结构体创建变量时才会占据内存空间。 ::: ::: warning 结构体声明中variable-list创建的变量是全局的结构体变量。 主函数中struct Stu创建的变量是局部的结构体变量。 在函数中应尽量少的使用全局变量,一般结构体变量在主函数中创建。 ::: 结构体创建的另一种写法:
typedef struct Stu
{
char name[20];
char sex[5];
short age;
char tel[12];
}Stu; //结构体类型
int main()
{
struct Stu s1; //结构体类型创建变量
Stu s2; //创建变量
return 0;
}
::: warning typedef表示把包含结构体关键字在内的整个结构体类型重新命名(将struct Stu改为Stu),新名字写在大括号结束后的分号前。 :::
结构体初始化
结构的成员可以是普通变量、数组、指针、其他结构体。 结构体变量在创建的同时对变量进行初始化称为结构体初始化。 结构体初始化:
typedef struct Stu
{
char name[20];
char sex[5];
short age;
char tel[12];
}Stu;
int main()
{
struct Stu s1 = {"张三","男",25,"13866666666"};
Stu s2 = {"李四","女",23,"13688888888"};
return 0;
}
结构体成员访问
结构体变量访问成员时通过点操作符(.)访问。点操作符接受两个操作数。
struct S
{
int a;
char c;
char arr[20];
double b;
};
struct M
{
char ch[10];
struct S s;
char* pc;
};
int main()
{
char arr[] = "hello world";
struct M m = { "hello",{10,'m',"hello word",3.14},arr};
printf("%s\n", m.ch);
printf("%s\n", m.s.arr);
printf("%lf\n", m.s.b);
printf("%d\n", m.s.a);
printf("%s\n", m.pc);
return 0;
}
hello
hello word
3.140000
10
hello world
结构体传参
typedef struct Stu
{
char name[20];
char sex[5];
short age;
char tel[12];
}Stu;
void Print1(Stu s)
{
printf("name:%s\n", s.name);
printf("tel:%s\n", s.tel);
}
void Print2(Stu* ps) //结构体指针。如果前面没有使用typedef重命名,指针名为struct Stu*
{
printf("name:%s\n", ps->name);
printf("tel:%s\n", ps->tel);
}
int main()
{
Stu s = {"李四","女",23,"13688888888"};
Print1(s);
Print2(&s);
return 0;
}
name:李四
tel:13688888888
name:李四
tel:13688888888
上述代码中Print1是函数传值,Print是函数传址。 ::: warning 传址比传值更好。 传值时需要把实参s传递到到结构体中的形参stu中,形参是实参的临时拷贝,需要占用和实参一样大的空间,空间浪费严重,传参也需要更多的时间。 传址时只需要把地址传过去,只需要4个或8个字节。在函数中只需要创建一个4或8个字节的结构体指针变量来接收。整体系统开销小。 :::
压栈
结构体传参时,要把结构体的地址传过去。