重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
在现实世界中,我们是如何处理名字和身高等信息的?加入我们需要汇总学生的体检信息,我们会将学生的姓名、性别、年龄、身高、体重等分别进行建表吗?显然这是不可能的,不说分别建设多张表的麻烦性,就算建好了,等进行调用查询时,也是一件麻烦的事情。通常是一个人一行数据,包含了所有信息。一个班所有的同学即为一个集合。
同一种类型的数据的集合是数组,和数组不同,结构体是多种类型的数据的集合。
如果我们需要统计体检信息,我们会用到以下类型:
char
类型的姓名int
类型的身高float
类型的体重struct student
{
char name[32]; //姓名
int height; //身高
float weight; //体重
};
其中
student
为结构名name、height、weight
为结构体成员
对上述代码可以简单说明为:将三个数据集中起来生成struct student
类型。也就是说这是数据类型的声明,而并没有定义对象(变量)的实体。声明之后,就相当于C语言库中的int、double
等类型创建int型
变量一样,可以创建struct student
类型的结构体变量。
如果映像现实,就如下图,生成一个框架,然后在进行打印,然后发给学生,让学生填写。
结构体成员可以是标量、数组、指针,甚至可以是其他结构体。
3.结构体变量的定义与初始化 (1). 定义在之前,我们使用int、doule等类型进行创建变量时是这样操作的:int a;
,而结构体类型进行创建变量也是如此。当我们已经进行好结构体声明之后,就可以进行结构体变量的创建。
struct student
{
char name[32]; //姓名
int height; //身高
float weight; //体重
}stu1,stu2;
其中
stu1
和stu2
即为struct studen
类型的变量。
2.方法二:先声明,再创建
struct student
{
char name[32]; //姓名
int height; //身高
float weight; //体重
};
struct student stu1;
struct student stu2;
(2). 初始化其中
stu1
和stu2
即为struct studen
类型的变量。
生成变量的时候要进行初始化,我们在创建变量的时候,最好同时进行初始化。
struct student
{
char name[32]; //姓名
int height; //身高
float weight; //体重
}stu1{"zhangsan",185,90.0};
struct student
{
char name[32]; //姓名
int height; //身高
float weight; //体重
};
struct student stu1 = {"zhangsan",185,90.0};
二. 访问结构体成员当我们声明一个结构体类型之后,使用这个结构体类型创建一个变量,这个结构体类型中有几个成员,这个结构体变量所对应的就有几个成员。例如以下代码:
struct student
{
//结构体成员
char name[32]; //姓名
int height; //身高
float weight; //体重
};
struct student stu1 = {"zhangsan",185,90.0};
上图:
而如果想通过创建的这个stu1
变量访问其中的成员,就需要使用到.
和->
操作符。
.
操作符(结构体变变量访问成员). 操作符 | a.b | 表示结构体a的成员b |
---|
我们可以看到stu1
中的成员有:name
、height
、weight
我们可以依靠.
操作符,使用结构体变量访问成员。
struct student stu1 = { "zhangsan",185,90.0 };
stu1.weight = 70.0;
printf("name: %s\n", stu1.name);
printf("height: %d\n", stu1.height);
printf("weight: %.1f\n", stu1.weight);
输出为:
name: zhangsan
height: 185
weight: 70.0
2.->
操作符(结构体指针访问指向变量的成员)-> 操作符 | a->b | 用指针访问结构体a中的成员b |
---|
我们可以通过结构体变量来访问指针,而有时候我们得到的不是结构体变量,而是一个指向结构体变量的指针。
void my_print(struct student* ps)
{
printf("name: = %s\n", (*ps).name);
//ps为一个指针变量,里面存储的是stu1的地址,通过地址可以直接找到stu1,然后再通过.操作符找到成员。
printf("name: = %s\n", ps->name);
//通过指针找到结构体变量,然后再通过.操作符找到成员,这种方式比较繁琐,而使用->操作符就比较简洁了。
}
int main()
{
struct student stu1 = { "zhangsan",185,90.0 };
my_print(&stu1);
return 0;
}
输出为:
name: = zhangsan
name: = zhangsan
三. 结构体传参我们知道,函数传参的方式分为值传参和址传参,在结构体进行传参时,我们应该选哪种传参方式呢?
void my_print1(struct student s)
{
//结构体传参
printf("name: = %s\n", s.name);
}
void my_print2(struct student* ps)
{
//结构体地址传参
printf("name: = %s\n", ps->name);
}
int main()
{
struct student stu1 = { "zhangsan",185,90.0 };
my_print1(stu1);
my_print2(&stu1);
return 0;
}
上述代码中的两种传参方式都可以进行传参,并且都可以输出想要的结果。但是在实际使用过程中,地址传参的方法是优于,结构体传参的。
因为在函数进行传参时,参数是需要压栈的,如果使用值传递,在传递一个结构体时,结构体过大,参数压栈的系统开销比较大,所以会导致性能下降。简单来说就是值传递,会创建一个临时拷贝,这个临时拷贝也会在内存中分配一块新的内存空间,如果需要拷贝的数据比较多,那么无疑这种方式会造成极大的浪费。
结构体传参时,要传递结构体变量的地址。
际使用过程中,地址传参的方法是优于,结构体传参的。
因为在函数进行传参时,参数是需要压栈的,如果使用值传递,在传递一个结构体时,结构体过大,参数压栈的系统开销比较大,所以会导致性能下降。简单来说就是值传递,会创建一个临时拷贝,这个临时拷贝也会在内存中分配一块新的内存空间,如果需要拷贝的数据比较多,那么无疑这种方式会造成极大的浪费。
结构体传参时,要传递结构体变量的地址。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧