当前位置: 首页 > news >正文

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

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

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

追梦之旅,你我同行

   
😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

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

前言🙌

    哈喽各位友友们😊,我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享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 结构体变量的定义和初始化

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

在这里插入图片描述当然,除了上述的初始化,结构体还支持嵌套初始化,也就是一个结构体的变量作为另外一个结构体的成员,然后初始化时可以进行嵌套初始化。这是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;
}

程序运行结果图:
在这里插入图片描述

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;

画图分析:
在这里插入图片描述

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

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

总结撒花💞

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

http://www.lryc.cn/news/5903.html

相关文章:

  • 2023新华为OD机试题 - 单词接龙(JavaScript) | 刷完必过
  • 第一章 一般错误信息 - 错误代码 0 到 99
  • MyBatis 之一(概念、创建项目、操作模式、交互流程)
  • 学习笔记:文件
  • 高考结束了以后应该做的事情(个人经历的总结)
  • 蓝桥杯:k倍区间
  • 【思维模型】概率思维的价值:找到你的人生算法!打开你的人生格局!实现认知跃迁!
  • API文档自动生成工具
  • 7、MyBatis框架——MyBatis对一对一关系的处理、分步查询、MyBatis对一对多关系的处理
  • 电商数据监测——中国白酒行业数据浅析
  • excel数据技巧:透视表快速统计年终业绩排名
  • TensorRT的Python接口解析
  • 【信管11.5】合同、采购、招投标相关法规
  • 使用 CSS 变量更改多个元素样式
  • 面试题(二十五)设计模式
  • 使用红黑树模拟实现map和set
  • 【django项目开发】用户登录后缓存权限到redis中(十)
  • 算法总结c++
  • Python 之 NumPy 切片索引和广播机制
  • Redis【包括Redis 的安装+本地远程连接】
  • 深度学习训练营_第P3周_天气识别
  • “华为杯”研究生数学建模竞赛2006年-【华为杯】C题:维修线性流量阀时的内筒设计问题(附获奖论文及matlab代码)
  • 数据结构:带环单链表基础OJ练习笔记(leetcode142. 环形链表 II)(leetcode三题大串烧)
  • 数模美赛如何找数据 | 2023年美赛数学建模必备数据库
  • SSTI漏洞原理及渗透测试
  • 【算法基础】高精度除法
  • optimizer.zero_grad(), loss.backward(), optimizer.step()的理解及使用
  • 融资、量产和一栈式布局,这家Tier 1如此备战高阶智驾决赛圈
  • centos7.8安装oralce11g
  • 【蓝桥杯集训·每日一题】AcWing 3956. 截断数组