【C生万物】 结构体篇

简介: 【C生万物】 结构体篇

目录


Part1:结构体的声明

1.概念

2.声明和定义

3.变量初始化

Part2:结构体成员访问

1.结构体变量访问成员

2.结构体指针访问成员

Part3:结构体传参


前言


这期继续C语言的学习,进行结构体的讲解,值得注意的是,这期的结构体只是简单的介绍和使用,后期会再次详细讲解。


正文


Part1:结构体的声明


1.概念


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


2.声明和定义


一图就懂:

513cb67821b57f14a877c65420ab0ea1_9445cd184aa3494f9f7faa8750e042df.png

如:

e35b09336280f5f01a25f7aba52f839a_ecb4e536deff432e9775fa9232da1f1d.png

声明一个学生结构体,其中包括学生的姓名 name ,年龄 age ,性别 sex

同时定义了两个该类型的结构体变量:s1 , s2.

当然先声明后定义也可以:

5f5578733836ebc49e3a8425faa43f84_af2976b25cfc4684962b7a3216361ea2.png

为了方便,还可以这样玩:

aeaa94216d405c225437ac67dfc0f6ca_46b610a737dc40dbb997e4b4b6283f25.png


3.变量初始化


初始化就是给结构体成员附一些初始值

继学生结构体:

ecf703d9307d9587b28ed07137b37358_55eca444b3ec456798563fcfb8ea033e.png

初始化:

Stu s1 = { "claffic",18,"boy" };


注意:初始化内容一定按顺序与类型匹配

那结构体里有结构体怎么办?

嵌套初始化即可:

typedef struct Point
{
  int x;
  int y;
};
struct Node
{
  int data;
  struct Point p;
  struct Node* next;
}n1 = { 10,{1,3},NULL };
struct Node n2 = { 20,{2,4},NULL };


Part2:结构体成员访问


1.结构体变量访问成员


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

0e7de588df1fce7a11e4748ed3c7029c_a796052465d64ae18e70a01063fa3cce.png

struct student s;
strcpy(s.name, "claffic"); // 字符串不可直接用 = 赋值
strcpy(s.sex, "boy");


2.结构体指针访问成员


有时我们得到的不是结构体变量,而是结构体指针,也可以访问结构体变量。

struct student
{
  char name[20];
  int age;
  char sex[5];
};
void Print(struct student* ps) // 传递指针
{
    // 解引用访问
  printf("name = %s  age = %d  sex = %s", (*ps).name, (*ps).age, (*ps).sex);
    // 指针访问 用 -> 操作符
  printf("name = %s  age = %d  sex = %s", ps->name, ps->age, ps->sex);
}
int main()
{
  struct student s = { "claffic",18,"boy" };
  Print(&s); // 传递地址,取地址
  return 0;
}


运行结果:

5ed55d841e92e1f791bb7e0f52c03237_3262fd781502466291992f76abf55467.png


Part3:结构体传参


传参与成员的访问大差不差

也是有两种类型:结构体变量传参 结构体指针传参

我们接下来对比一下两种方法:

struct S
{
  int data[1000];
  int num;
};
struct S s = { {1,2,3,4}, 500 };
//结构体传参
void Print1(struct S s)
{
  printf("%d\n", s.num);
}
//结构体地址传参
void Print2(struct S* ps)
{
  printf("%d\n", ps->num);
}
int main()
{
  Print1(s);  // 传结构体
  Print2(&s); //传地址
  return 0;
}


以上方式展示了两种传参的方式,

试想一下, Print1 Print2 哪个好?

首选 Print2

原因:

函数传参的时候,参数是需要压栈的。

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

而指针的大小是固定不变的,开销稳定。

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


总结:

这就是结构体的初级知识介绍了,整体上不算复杂,会定义和使用结构体即可。


码文不易

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗



目录
相关文章
|
6月前
|
编译器
C生万物 | 从浅入深理解指针【第二部分】(一)
C生万物 | 从浅入深理解指针【第二部分】 前言: 如果没有看过第一部分的话,推荐先看第一部分,然后再来看第二部分~~
|
6月前
|
存储 C语言
【C生万物】数组
【C生万物】数组
|
6月前
|
存储 C语言 C++
C生万物 | 从浅入深理解指针【第一部分】(一)
C生万物 | 从浅入深理解指针【第一部分】
|
6月前
|
机器学习/深度学习 安全 程序员
C生万物 | 从浅入深理解指针【第一部分】(二)
C生万物 | 从浅入深理解指针【第一部分】(二)
|
11月前
|
存储 编译器 C++
C生万物 | 聊聊枚举与联合体的用法
C生万物 | 聊聊枚举与联合体的用法
51 0
|
11月前
|
存储 编译器 C语言
C生万物 | 指针进阶 · 炼狱篇-1
C生万物 | 指针进阶 · 炼狱篇
84 0
|
11月前
C生万物 | 指针进阶 · 炼狱篇-2
C生万物 | 指针进阶 · 炼狱篇
49 0
|
11月前
|
算法 安全 Java
C生万物 | 指针进阶 · 提升篇-1
C生万物 | 指针进阶 · 提升篇
52 0
|
11月前
|
小程序 Linux C语言
C生万物 | 指针进阶 · 提升篇-3
C生万物 | 指针进阶 · 提升篇
60 0
|
11月前
|
存储 编译器 C语言
C生万物 | 指针进阶 · 炼狱篇-3
C生万物 | 指针进阶 · 炼狱篇
67 0