初阶结构体

简介: 初阶结构体

1 结构体的声明

1.1 结构的基础知识

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

(数组是一组相同类型元素的集合)因为生活中的对象都是复杂的,比如:一个人:姓名+年龄+性别+电话 才能描述。(结构体就是用来描述复杂对象的)

1.2 结构的声明

1. struct stu    //struct 是结构体关键字,stu(这个是自己定义的,student的前三个字母)
2. {//学生:姓名+年龄+分数
3.  char name[20];//姓名是字符类型,
4.  int age;//年龄 
5.  float score;//分数
6. };

1.3 结构成员的类型

结构的成员可以是标量、数组、指针,甚至是其他结构体

1.4 结构体变量的定义和初始化

1.4.1 结构体类型的局部定义

定义一个局部的结构体变量,代码展示:

1. struct stu    //struct 是结构体关键字,stu(这个是自己定义的,student的前三个字母)
2. {//学生:姓名+年龄+分数
3.  char name[20];//姓名是字符类型,
4.  int age;//年龄 
5.  float score;//分数
6. };
7. int main()
8. {
9.  struct stu s;//s就是结构体变量,struct stu 就是和int char float 一样的类型
10.   return 0;
11. }

1.4.2 结构体类型的全局定义

定义一个全局的结构体变量,代码展示:

1. struct stu    //struct 是结构体关键字,stu(这个是自己定义的,student的前三个字母)
2. {//学生:姓名+年龄+分数
3.  char name[20];//姓名是字符类型,
4.  int age;//年龄 
5.  float score;//分数
6. }s1, s2;//这里的s1 s2 和s一样,也是结构体变量,(全局的)
7. int main()
8. {
9.  struct stu s;//s就是结构体变量,struct stu 就是和int char float 一样的类型,但是却是局部的
10.   return 0;
11. }

注意:

结构体变量,那个分号不能丢。

1.4.3 结构体类型的初始化

代码展示:

1. struct stu    
2. {
3.  char name[20];
4.  int age;
5.  float score;
6. };
7. int main()
8. {
9.  struct stu s = { "xiaoming", 20, 97.5f };//97.5 后面加f说明是float类型,不加的话,会默认为为double类型
10.   printf("%s %d %f", s.name, s.age, s.score);
11.   return 0;
12. }

97.5 后面加f说明是float类型,不加的话,系统会默认为为double类型

1.4.4 结构体类型嵌套初始化

代码展示:

1. #include <stdio.h>
2. struct S
3. {
4.  int a;
5.  char b;
6.  double c;
7. };
8. struct stu
9. {
10.   struct S ss;
11.   char name[20];
12.   int age;
13.   float score;
14. };
15. int main()
16. {
17.   struct stu s = { { 20, 's', 3.14 },"xiaoming", 20, 97.5f };
18.   printf("%d %c %lf %s %d %f", s.ss.a, s.ss.b,s.ss.c,s.name, s.age, s.score);
19.   return 0;
20. }
1. struct Node
2. {
3. int data;
4. struct Point p;
5. struct Node* next;
6. }n1 = {10, {4,5}, NULL};

2 结构体成员的访问

(1) 结构体变量访问成员

结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数

(2)结构体指针访问指向变量的成员

3 结构体传参

代码展示:(结构体传参)

1. #include <stdio.h>
2. struct mn
3. {
4.  int arr[1000];
5.  int a;
6.  char ch[100];
7. };
8. void print(struct mn n)
9. {
10.   int i = 0;
11.   for (i = 0; i < 10; i++)
12.   {
13.     printf("%d ", n.arr[i]);
14.   }
15.   printf("\n");
16.   printf("%d\n", n.a);
17.   printf("%s\n", n.ch);
18. }
19. int main()
20. {
21.   struct mn s = { { 1,2,3,4,5,6,7,8,9,10 }, 8, "abcdefg" };
22.   print(s);
23.   return 0;
24. }

代码展示:(结构体地址传参)

1. #include <stdio.h>
2. struct mn
3. {
4.  int arr[1000];
5.  int a;
6.  char ch[100];
7. };
8. 
9. void print(struct mn* n)
10. {
11.   int i = 0;
12.   for (i = 0; i < 10; i++)
13.   {
14.     printf("%d ", n->arr[i]);
15.   }
16.   printf("\n");
17.   printf("%d\n", n->a);
18.   printf("%s\n", n->ch);
19. }
20. 
21. int main()
22. {
23.   struct mn s = { { 1,2,3,4,5,6,7,8,9,10 }, 8, "abcdefg" };
24.   print(&s);
25.   return 0;
26. }

结构体传参,形参是实参的一份临时拷贝。所以会浪费大量的内存。但是结构体传地址,仅仅把4个字节或者8 个字节传过去即可。

所以我们最佳选择是 结构体传址。原因是:函数传参的时候,参数是需要压栈的。

如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的

下降

结论:
结构体传参的时候,要传结构体的地址。

相关文章
|
18天前
|
编译器 Linux C语言
C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)
C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)
|
4月前
初阶结构体
初阶结构体
22 0
|
5月前
|
C语言
C语言 11 结构体初阶
C语言 11 结构体初阶
22 0
|
6月前
|
C语言
C语言初阶-初识结构体
C语言初阶-初识结构体
33 0
|
6月前
|
C语言
零基础玩转C语言—结构体【初阶】
零基础玩转C语言—结构体【初阶】
31 0
|
7月前
|
C语言
【初阶C语言】学会结构体
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
28 0
|
9月前
|
编译器 C语言
【C语言】初阶结构体
书接上回,上一章将初识指针讲完了,相信只要你将该章节读完,肯定对大部分的指针有了一定的了解,并且你肯定对指针这一重要的知识点有了个基础的认识,本章将写的内容时初阶的结构体,当你将本认真的读完,相信你肯定也会对什么是结构体、以及结构体的使用,有更深的了解。所以系好安全带,发出啦!
|
10月前
|
编译器 C语言
【C语言初阶篇】自定义类型结构体我不允许还有人不会!(下)
【C语言初阶篇】自定义类型结构体我不允许还有人不会!(下)
100 0
|
10月前
|
C语言
【C语言初阶篇】自定义类型结构体我不允许还有人不会!(上)
【C语言初阶篇】自定义类型结构体我不允许还有人不会!
111 0
|
10月前
|
C语言
初阶C语言——结构体
初阶C语言——结构体