C 语言结构体使用
1. 结构体的声明和定义
1.1 介绍
- 我们知道数组是同种类型值的集合,而结构就是可以将不同类型的值放在一起。
- 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
- 结构的成员可以是标量、数组、指针,甚至是其他结构体。
如我们可以将一个学生的一些属性放在一起
1
2
3
4
5
6
7
8
9
10
11
|
struct stu //定义一个结构体类型,就如int、char,struct stu是我们定义的结构体类型
{
//成员变量
char name[20]; //名字
int age; //岁数
char id[20]; //学号
};
int main()
{
struct stu a; //定义一个struct stu类型的变量a,而对象a中就包含了名字,岁数,学号的属性
}
|
1.2定义的几种类型
类型1:
1
2
3
4
5
6
7
8
9
|
struct stu
{
char name[20];
int age;
};
int main()
{
struct stu a; //定义局部变量a
}
|
类型2:
1
2
3
4
5
|
struct stu
{
char name[20];
int age;
}s1,s2; //定义全局变量s1,s2
|
2. 结构体初始化
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
struct book
{
float height;
char name[20];
}b;
struct stu
{
char name[20];
int age;
char id[20];
struct book b;
};
int main()
{
//初始化时,其实是和数组初始化一样,用大括号,里面放上初始化的值。若结构体里面包含结构体,则大括号里面 //在放一个大括号,里面放内部结构体初始化的值
struct stu a={ "bobo" ,18, "2021520" ,{15.8, "free" }};
}
|
3. 结构体成员访问
3.1 成员介绍
- 结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数,如:m.n(m为结构体变量,n为结构体中你想要访问的成员变量)
- 指向一个结构体的指针访问指向变量的成员是通过操作符(->)访问的。 如:m->n(m为指向一个结构体的指针,n为结构体中你想要访问的成员变量),也可以(*m).n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
struct book
{
float height;
char name[20];
}b;
struct stu
{
char name[20];
int age;
char id[20];
struct book b;
};
int main()
{
struct stu a={ "bobo" ,18, "2021520" ,{15.8, "free" }};
//法一
printf ( "%s\n" ,a.name);
printf ( "%d\n" ,a.age);
printf ( "%.1f\n" ,a.b.height); //若访问结构体中的结构体中的一个成员,先访问到内部的结构体,再访问内部结构体中的成员
//法二
struct stu* pa=&a;
printf ( "%s\n" ,pa->name);
printf ( "%d\n" ,pa->age);
printf ( "%.1f\n" ,pa->b.height);
//法三
printf ( "%s\n" ,(*pa).name);
printf ( "%d\n" ,(*pa).age);
printf ( "%.1f\n" ,(*pa).b.height);
}
|
4. 结构体传参
注意:
结构体传参的时候
,要传结构体的地址
更好
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
struct book
{
float height;
char name[20];
}b;
struct stu
{
char name[20];
int age;
char id[20];
struct book b;
};
void print1( struct stu p)
{
printf ( "%s %d %s %.1f %s" ,p.name,p.age,p.id,p.b.height,p.b.name);
}
void print2( struct stu* pa)
{
printf ( "%s %d %s %.1f %s" ,pa->name,pa->age,pa->id,pa->b.height,pa->b.name);
}
int main()
{
struct stu a={ "bobo" ,18, "2021520" ,{15.8, "free" }};
//写一个函数打印a的内容
print1(a); //结果为:bobo 18 2021520 15.8 free(正常打印)
//再写一个函数,通过传a的地址打印a的内容
print2(&a); //结果为:bobo 18 2021520 15.8 free(正常打印)
return 0;
}
|
那么传值和传址有什么不同,哪个更好呢?(首选传址)
- 传参时,其实是对实参的一份拷贝,是会开辟一块空间来存储实参。传值,是将整个实参拷贝过去,而传地址,传过去的只是地址,传参的效率更高一些。
- 函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
那么什么是函数调用的参数压栈呢?
栈:一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表
特点:先进的后出,后进的先出。(先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来))
压栈:给栈里存数据
- 每一个函数的调用都会在内存的栈区上开辟一块空间,并且数据都会如压栈一样一个一个的存放进栈区,如果数据比较多、大时,参数压栈就比较吃力,所以导致性能就会下降。
到此这篇关于C 语言结构体的使用基础版的文章就介绍到这了,更多相关C 语言结构体的使用内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/weixin_51367845/article/details/117253544