目录
1. 结构体的声明
1.1 结构的基础知识
1.2 结构体类型的声明
1.3 结构体成员的类型
1.4 结构体变量的创建和初始化
1.4.1 结构体变量的创建:
1.4.2 结构体变量的初始化:
2. 结构体成员的访问
2.1 结构体变量访问结构体成员
2.2 结构体指针访问结构体成员
2.3 结构体成员的访问的总结
3. 结构体传参
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构是一种集合。结构中的每个成员可以是不同类型。
类比和区别:数组是一组相同类型元素的集合,放在数组中的所有元素类型是相同的。
目前我们已经学过一些类型 : 字符型(char),整型(short,int...),浮点型(float,double) ,这些类型是内置类型。
但是生活中总会有一些复杂对象,比如:人,人有姓名,性别,电话,身高等;再比如:书,书有书名,作者,定价,书号等,这些复杂对象无法用内置类型来描述。那么如何来描述这些复杂对象呢?于是就有了结构体的出现,结构体是一种用户定义的数据类型,即自定义类型,是用来描述复杂对象的。
struct:结构体关键字,它表明是个结构体,结构体的声明必须有struct。
结构体标签:它是你给你的结构体类型取的名字
struct 结构体标签:这表示一个结构体类型
成员列表:可以有多个成员,每个成员有各自的数据类型和成员变量名。
结构体变量列表:可以有多个变量,是使用结构体类型创建的变量,一般结构体变量列表省略不写,先先进行结构体声明,之后再创建结构体变量。
举一个结构体类型声明的例子:
下面是有结构体变量列表的情况
结构体的成员可以是标量(int,float,double)、数组、指针,甚至是其他结构体(变量)。
比如:
创建局部变量p1:
类型不占用内存,只有用类型创建变量后才占用内存。
创建全局变量p2,p3:
初始化:创建变量的同时给变量赋值。
结构体变量 . 结构体成员变量
结构体指针 -> 结构体成员变量
结构体变量通过点操作符(.)访问结构体成员。
结构体变量 . 结构体成员变量
像这样:
举例1:
#include
//声明的结构体类型是:struct Peo
struct Peo
{
char name[20];
char sex[5];
char tele[12];
int high;
};
//声明的结构体类型是:struct S
struct S
{
struct Peo p;
int sum;
float f;
};
int main()
{
struct Peo p1 = { "张三","男","12366784567",183 };
struct S s = { {"李四","男","12366784567",186},10,3.14f };
printf("%s %s %s %d\n",p1.name,p1.sex,p1.tele,p1.high);
printf("%s %s %s %d %d %f",s.p.name,s.p.sex,s.p.tele,s.p.high,s.sum,s.f);
return 0;
}
举例2:结构体传参(传的是结构体变量)
代码如下:
#include
//声明的结构体类型是:struct Peo
struct Peo
{
char name[20];
char sex[5];
char tele[12];
int high;
};
void print(struct Peo sp)//结构体类型的变量来接收
{
printf("%s %s %s %d\n", sp.name, sp.sex, sp.tele, sp.high);
}
int main()
{
struct Peo p1 = { "张三","男","12366784567",183 };
print(p1);//传的是结构体类型的变量
return 0;
}
结构体指针通过操作符(->)访问结构体成员。
结构体指针 -> 结构体成员变量
像这样:
举例:结构体传参(传的是结构体变量的地址)
#include
//声明的结构体类型是:struct Peo
struct Peo
{
char name[20];
char sex[5];
char tele[12];
int high;
};
void print(struct Peo* sp)//结构体类型的指针来接收
{
printf("%s %s %s %d\n", sp->name, sp->sex, sp->tele, sp->high);
}
int main()
{
struct Peo p1 = { "张三","男","12366784567",183 };
print(&p1);//传的是结构体变量名的地址,结构体类型的地址
return 0;
}
结构体变量 . 结构体成员变量
结构体指针 -> 结构体成员变量
举例:
代码如下:
#include
//声明的结构体类型是:struct Peo
struct Peo
{
char name[20];
char sex[5];
char tele[12];
int high;
};
//声明的结构体类型是:struct S
struct S
{
struct Peo p;
int sum;
float f;
};
void print(struct Peo* sp,struct S* ss)//结构体类型的指针来接收
{
printf("%s %s %s %d\n",sp->name,sp->sex,sp->tele,sp->high);
//结构体指针->结构体成员变量:sp->name
printf("%s %s %s %d %d %f\n",ss->p.name,ss->p.sex,ss->p.tele,ss->p.high,ss->sum,ss->f);
//结构体指针->结构体成员变量:ss->p 结构体变量.结构体成员变量:p.name
}
int main()
{
struct Peo p1 = { "张三","男","12366784567",183 };
struct S s = { {"李四","男","12366784567",186},10,3.14f };
print(&p1,&s);//传的是结构体变量名的地址,结构体类型的地址
return 0;
}
结构体传参的时候,要传结构体的地址。
如果传的是结构体变量,形参是实参的一份临时拷贝,会造成大量内存空间的浪费。
如果传的是结构体的地址,形参接收到的是个指针,形参部分只要开辟一个指针变量的大小的内存空间,只需要4个字节或8个字节,减少空间的浪费。