你是真的“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语言详解结构体的相关知识点。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

相关文章
|
9月前
|
监控 API 数据处理
速卖通商品数据尽在掌握:揭秘高效利用API接口获取详情策略
速卖通(AliExpress)API助力电商数据处理与分析,提供商品搜索、价格监控等功能。开发者需注册账号、创建应用并获取API Key。常用接口包括商品搜索和详情API。调用时注意频率限制、数据延迟及错误处理。本文介绍全过程并附Python示例代码,帮助提升电商运营效率。
|
存储 数据采集 数据可视化
基于Python flask+MySQL+echart的电影数据分析可视化系统
该博客文章介绍了一个基于Python Flask框架、MySQL数据库和ECharts库构建的电影数据分析可视化系统,系统功能包括猫眼电影数据的爬取、存储、展示以及电影评价词云图的生成。
699 1
|
12月前
|
SQL Oracle 关系型数据库
安装最新 MySQL 8.0 数据库(教学用)
安装最新 MySQL 8.0 数据库(教学用)
536 4
|
存储 算法 程序员
C++ 11新特性之function
C++ 11新特性之function
316 9
|
12月前
|
前端开发 JavaScript 编译器
2024最新VSCode实用插件推荐,开发效率遥遥领先!超全面,快收藏~
【10月更文挑战第11天】2024最新VSCode实用插件推荐,开发效率遥遥领先!超全面,快收藏~
2240 0
2024最新VSCode实用插件推荐,开发效率遥遥领先!超全面,快收藏~
|
机器人
[ROS2] --- action
[ROS2] --- action
431 0
|
SQL 存储 算法
SpringBoot整合ShardingSphere实现分表分库&读写分离&读写分离+数据库分表
SpringBoot整合ShardingSphere实现分表分库&读写分离&读写分离+数据库分表
2733 0
SpringBoot整合ShardingSphere实现分表分库&读写分离&读写分离+数据库分表
|
XML 前端开发 JavaScript
CSS中动画、过渡、定位、浮动的作用
CSS中动画、过渡、定位、浮动的作用
|
算法 C++
继承和派生知识点总结 C++程序设计与算法笔记总结(四) 北京大学 郭炜(一)
继承和派生知识点总结 C++程序设计与算法笔记总结(四) 北京大学 郭炜(一)
222 0
|
C语言 C++
简述C语言中内存区域的划分
简述C语言中内存区域的划分
91 0