你是真的“C”——详解结构体知识点

简介: 前言🙌什么是结构体?🙌1. 结构体的声明🙌1.1 结构的基础知识1.2 结构的声明1.3 结构成员的类型1.4 结构体变量的定义和初始化2. 结构体成员的访问🙌3结构体传参🙌总结撒花💞

微信图片_20230427160703.gif

😎博客昵称:博客小梦

😊最喜欢的座右铭:全神贯注的上吧!!!

😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘微信图片_20230427160707.gif


前言🙌


    哈喽各位友友们😊,我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享C语言中结构体相关的知识点~ 都是精华内容,可不要错过哟!!!😍😍😍


什么是结构体?🙌


1. 结构体的声明🙌


1.1 结构的基础知识


   在我们生活的世界,是十分丰富多彩的,C语言虽然提供了许多的类型,但是对于描述这个丰富多彩的世界,是不够用的。因此,需要自定义一些类型。而结构体就属于自定义数据类型的一种。比如描述老师,描述同学,抑或是描述学生,该用什么类型呢?为了解决这些问题,结构体就出现了。

简单的概括来说:结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。


1.2 结构的声明


那么结构体是如何声明的呢?接下来我举个栗子辅助大家理解一下:

typedef struct Stu
{
 char name[20];//名字
 int age;//年龄
 char sex[5];//性别
 char id[20];//学号
}Stu;//分号不能丢


1.3 结构成员的类型


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


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


有了结构体类型,那如何定义变量,其实很简单。请看下图分析:

微信图片_20230427161109.png

当然,除了上述的初始化,结构体还支持嵌套初始化,也就是一个结构体的变量作为另外一个结构体的成员,然后初始化时可以进行嵌套初始化。这是C语言语法支持的。在结构体中,很常会见到与 typedef 结合使用,这是为什么呢?其实,typedef 可以起到结构体类型重命名的作用,目的是为了简单化结构体类型名。接下来举个栗子辅助大家理解:


typedef struct Node
{
  int data;
  struct Node* next;
}Node;
int main()
{
  struct Node b1;
  Node b2;
  return 0;
}

有上述代码可以看出,定义结构体b1变量明显比定义b2要复杂,类型名得到简化提高了代码的阅读性。


2. 结构体成员的访问🙌


结构体变量访问成员


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

2.结构体指针访问指向变量的成员有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。结构体指针->结构体成员

这里举个栗子:

#include <stdio.h>
struct Book
{
  char name[20];
  int price;
};
void print(struct Book* p)
{
  printf("%s %d\n", p->name, p->price);
}
int main()
{
  struct Book b1 = {"C语言", 66};
  struct Book b2 = { .price = 80, .name = "数据结构"};//初始化成员变量可以不按照声明的顺序
  //结构体变量.结构体成员
  printf("%s %d\n", b1.name, b1.price);
  printf("%s %d\n", b2.name, b2.price);
  //结构体指针->结构体成员
  struct Book* p1 = &b1;
  print(&b1);
  return 0;
}


程序运行结果图:

微信图片_20230427161422.png


3结构体传参🙌


结构体传参是怎么传的呢?其实也有两种传法,第一种是传值调用,另外一种就是传址调用啦那这两种传参的方法哪种更优呢?接下来我举个栗子辅助大家理解这两种传参方法。

#include <stdio.h>
struct S
{
  int arr[100];
  int n;
};
void print1(struct S ss)
{
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d ", ss.arr[i]);
  }
  printf("\n%d\n", ss.n);
}
void print2(struct S* ps)
{
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d ", ps->arr[i]);
  }
  printf("\n%d\n", ps->n);
}
int main()
{
  struct S s = { {1,2,3,4,5}, 100 };
  print1(s);
  print2(&s);
  return 0;


画图分析:

微信图片_20230427161522.png


因为函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。因此,选择传址调用方法才是最优的选择。


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


总结撒花💞


   本篇文章旨在分享C语言详解结构体的相关知识点。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

相关文章
|
4月前
|
存储 程序员 编译器
|
6月前
|
编译器 C语言 C++
C语言进阶:结构体的声明
C语言进阶:结构体的声明
38 0
|
6月前
|
编译器 Linux C语言
C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)
C语言:结构体(自定义类型)知识点(包括结构体内存对齐的热门知识点)
|
6月前
|
编译器 Linux C语言
自定义类型:结构体进阶学习分享
自定义类型:结构体进阶学习分享
43 0
|
编译器 C++
C进阶:结构体的内存对齐
C进阶:结构体的内存对齐
88 0
|
6月前
初阶结构体
初阶结构体
34 0
|
C++
【C++知识点】结构体和共用体
【C++知识点】结构体和共用体
199 0
|
存储 编译器 Linux
【c语言进阶】结构体最常用知识点大全 中
【c语言进阶】结构体最常用知识点大全 中
98 0
|
存储 编译器 C语言
【c语言进阶】结构体最常用知识点大全 上
【c语言进阶】结构体最常用知识点大全 上
92 0