初阶C语言-结构体

🌞 “少年有梦不至于心动,更要付诸行动。” 今天我们一起学习一下结构体的相关内容!
结构体
- 🎈1.结构体的声明
- 1.1结构的基础知识
- 1.2结构的声明
- 1.3结构成员的类型
- 1.4结构体变量的定义和初始化
- 🎈2.结构体成员的访问
- 2.1结构体变量访问成员
- 2.2结构体指针访问指向变量的成员
- 🎈3.结构体传参
🎈1.结构体的声明
1.1结构的基础知识
📖结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。
1.2结构的声明
📝为什么会出现结构体呢?在我们当前的一些学习中,我们学过的类型都是内置类型,例如:char short int double 等等。但是,它们无法描述一个复杂的对象,比方说人,我们很难用一个类型描述出它。相反,我们可能需要通过性别、年龄、身高、体重等等来进行描述。
🧩对于结构体的声明,格式如下:
struct tag
{member-list;//成员变量的列表
}variable-list;//变量列表
📖下面,给出一个学生的结构体的声明:
struct Stu//struct是结构体的关键字
{//学生的相关属性char name[20];//姓名int age;//年龄char sex[5];//性别char tele[12];//电话
}s3,s4;
//s3,s4是结构体类型的变量,但是s3,s4是全局变量。
int main()
{struct Stu s1;struct Stu s2;//s1,s2也是结构体类型的变量,但是是局部变量return 0;
}

🔎这里的话,可能有的同学在想,如果每次在主函数内来定义一个结构体变量都要加struct Stu是不是太麻烦了,能不能把这个去掉呢,或者说有没有更简单的表达方法呢?我们这个时候,就需要用到typedef(typedef顾名思义是类型定义的,这里理解为类型重命名。链接: 关于关键字讲解的链接)那么,程序可以做以下修改:
typedef struct Stu//struct是结构体的关键字
{//学生的相关属性char name[20];//姓名int age;//年龄char sex[5];//性别char tele[12];//电话
}Stu;//Stu是重命名产生的新的类型
int main()
{Stu s1;Stu s2;//s1,s2是结构体类型的变量return 0;
}
1.3结构成员的类型
📖结构体成员的类型可以是标量、数组、指针,甚至是其他结构体。
struct B
{int a;short b;
};
struct C
{char c;int num;int arr[10];double* p;struct B b;struct B* p;
};
1.4结构体变量的定义和初始化
🧩结构体变量的定义:
struct A
{int age;char sex;
}a1;//a1是全局变量
struct A a2;//a2也是全局变量
int main()
{struct A a3;//局部变量return 0;
}
📖当我们想要给这些变量一些值的时候,我们就需要对变量进行初始化:
struct A
{int age;char sex;int arr[10];
}a1;//a1是全局变量
struct A a2;//a2也是全局变量
int main()
{//对于结构体的初始化可以用一对大括号来进行//按照顺序初始化struct A a3 = { 18,'M',{1,2,3,4,5,6,7,8,9,10} };//局部变量//给指定的成员初始化struct A a4 = { .age = 20,.arr = {6,6,6} };return 0;
}
🔎我们可以通过监视来看看变量初始化的情况:

🎈2.结构体成员的访问
2.1结构体变量访问成员
📖结构变量的成员通过点操作符
(.)访问的,点操作符要接受两个操作数。
下面我们给出示例,带大家了解一下:
#include <stdio.h>
#include <string.h>
struct A
{char name[20];int age;char sex;
};
void Set_a(struct A t)
{t.age = 10;//t.name = "zhangsan";//这里我们发现会报错,因为name是数组名,数组是常量的地址,不能改变,这里我们就需要用到strcpy函数来进行拷贝strcpy(t.name, "zhangsan");//字符串拷贝t.sex = 'M';
}
int main()
{struct A a = { 0 };//写一个函数给a中存放数据Set_a(a);return 0;
}
🔎我们上面这段代码对不对呢?变量a是否被初始化了呢?这里,我们调试着看一看:

🧩我们发现a并没有被初始化,这是为什么呢?
✅注意:实参传递给形参的时候,形参是实参的一份临时拷贝,对形参的修改不会影响实参❗
🎈通过前面的学习,我们知道这里应该通过传地址的方式来改变实参的值:
#include <stdio.h>
#include <string.h>///strcpy函数的头文件
struct A
{char name[20];int age;char sex;
};
void Set_a(struct A *t)
{(*t).age = 10;//t.name = "zhangsan";//这里我们发现会报错,因为name是数组名,数组是常量的地址,不能改变,这里我们就需要用到strcpy函数来进行拷贝strcpy((*t).name, "zhangsan");//字符串拷贝(*t).sex = 'M';
}
int main()
{struct A a = { 0 };//写一个函数给a中存放数据Set_a(&a);return 0;
}

🌞同样的,既然这里我们用到了指针,不妨可以用指针访问指向变量的成员!
2.2结构体指针访问指向变量的成员
📖通过结构体指针来访问成员可以通过操作符
->来实现。
🧩上述代码可以做以下修改,结果相同:
#include <stdio.h>
#include <string.h>
struct A
{char name[20];int age;char sex;
};
void Set_a(struct A* t)
{t->age = 10;strcpy(t->name, "zhangsan");//字符串拷贝t->sex = 'M';
}
int main()
{struct A a = { 0 };//写一个函数给a中存放数据Set_a(&a);return 0;
}

🎈3.结构体传参
#include <stdio.h>
struct B
{int date[100];int num;
};
struct B b = { {1,2,3},12 };
void Print1(struct B b)
{printf("%d\n", b.num);
}
void Print2(struct B *b)
{printf("%d\n", b->num);
}
int main()
{Print1(b);Print2(&b);return 0;
}

🔎对于上面两个函数
Print1和Print2,用哪个更好呢?这里我们选择函数Print2!
✅注:函数传参的时候,参数是需要压栈的❗如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降!
❤️结论:结构体传参的时候,要传结构体的地址!
好啦,关于结构体的知识点到这里就结束啦,后期会继续更新C语言的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️
相关文章:
初阶C语言-结构体
🌞 “少年有梦不至于心动,更要付诸行动。” 今天我们一起学习一下结构体的相关内容! 结构体 🎈1.结构体的声明1.1结构的基础知识1.2结构的声明1.3结构成员的类型1.4结构体变量的定义和初始化 🎈2.结构体成员的访问2.1结…...
Android Studio实现解析HTML获取图片URL,将URL存到list,进行瀑布流展示
目录 效果展示build.gradle(app)添加的依赖(用不上的可以不加)AndroidManifest.xml错误代码activity_main.xmlitem_image.xmlMainActivityImage适配器ImageModel 接收图片URL效果展示 build.gradle(app)添加的依赖(用不上的可以不加) dependencies {implementation co…...
java学习004
常用数据结构对应 php中常用的数据结构是Array数组,相对的在java开发中常用的数据结构是ArrayList和HashMap,它们可以看成是array的拆分,一种简单的对应关系为 PHPJAVAArray: array(1,2,3)ArrayListlArray: array(“name” > “jack”,“…...
Linux网络编程:网络基础
文章目录: 1.协议 2.锁 3.网络层次模型 4.以太网帧和ARP协议 5.IP协议 6.UDP协议 7.TCP协议 8.BS模式和CS模式 9.网络套接字(socket) 10.网络字节序 11.IP地址转换函数 12.sockaddr地址结构 学习Linux的网络编程原则上基于:Linux的系统编程…...
3D沉浸式旅游网站开发案例复盘【Three.js】
Plongez dans Lyon网站终于上线了。 我们与 Danka 团队和 Nico Icecream 共同努力,打造了一个令我们特别自豪的流畅的沉浸式网站。 这个网站是专为 ONLYON Tourism 和会议而建,旨在展示里昂最具标志性的活动场所。观看简短的介绍视频后,用户…...
IO的几个模型
I/O模型名词介绍 说到I/O模型,都会牵扯到同步、异步、阻塞、非阻塞这几个词,以下讲解这几个词的概念。 阻塞和非阻塞 阻塞和非阻塞指的是一直等还是可以去做其他事。 阻塞(blocking):调用结果返回之前,…...
中路对线发现正在攻防演练中投毒的红队大佬
背景 2023年8月14日晚,墨菲安全实验室发布《首起针对国内金融企业的开源组件投毒攻击事件》NPM投毒事件分析文章,紧接着我们在8月17日监控到一个新的npm投毒组件包 hreport-preview,该投毒组件用来下载木马文件的域名地址竟然是 img.murphys…...
【LINUX相关】生成随机数(srand、/dev/random 和 /dev/urandom )
目录 一、问题背景二、修改方法2.1 修改种子2.2 使用linux中的 /dev/urandom 生成随机数 三、/dev/random 和 /dev/urandom 的原理3.1 参考连接3.2 重难点总结3.2.1 生成随机数的原理3.2.2 随机数生成器的结构3.2.3 二者的区别和选择 四、在代码的使用方法 一、问题背景 在一个…...
spark使用心得
spark入门 启停spark sbin/start-all.shsbin/stop-all.shspark-shell 进入spark/bin目录,执行: ./spark-shell 输出中有这么一行: Spark context Web UI available at http://xx.xx.xx.188:4040意味着我们可以从web页面查看spark的运行情…...
什么是边车
名词和概念定义 Sidecar:边车。微服务中数据平面的进程,负责转发应用、服务请求,并支持限流、熔断、负载均衡等特性。 Control-plane: 控制平面。微服务的配置中心,负责配置下发、数据搜集、服务发现等功能。 应用: 应用是指服务…...
vue项目打包成exe文件
1. 获取electron-quick-start demo git clone https://github.com/electron/electron-quick-start2. 安装依赖包 npm install 或 npm i // 安装依赖时可能会遇到node版本的问题,需要切换node版本的可以先看下nvm,简单易操作3. 打包项目(需要…...
基于MFCC特征提取和GMM训练的语音信号识别matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 MFCC特征提取 4.2 Gaussian Mixture Model(GMM) 4.3. 实现过程 4.4 应用领域 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3…...
client-go实战之十二:选主(leader-election)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《client-go实战》系列的第十二篇,又有一个精彩的知识点在本章呈现:选主(leader-election)在解释什么是选主之前&…...
2023年即将推出的CSS特性对你影响大不大?
Google开发者大会每年都会提出有关于 Web UI 和 CSS 方面的新特性,今年又上新了许多新功能,今天就从中找出了影响最大的几个功能给大家介绍一下 :has :has() 可以通过检查父元素是否包含特定子元素或这些子元素是否处于特定状态来改变样式,也…...
opencv实战项目-停车位计数
手势识别系列文章目录 手势识别是一种人机交互技术,通过识别人的手势动作,从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪(定位手部关键点) 2.opencv实战项目 实现手势跟踪并返回位置信息&a…...
NLP文本匹配任务Text Matching [无监督训练]:SimCSE、ESimCSE、DiffCSE 项目实践
NLP文本匹配任务Text Matching [无监督训练]:SimCSE、ESimCSE、DiffCSE 项目实践 文本匹配多用于计算两个文本之间的相似度,该示例会基于 ESimCSE 实现一个无监督的文本匹配模型的训练流程。文本匹配多用于计算两段「自然文本」之间的「相似度」。 例如…...
复习vue3,简简单单记录
这里的知识是结合视频以及其他文章一起学习,仅用于个人复习记录 ref 和reactive ref 用于基本类型 reactive 用于引用类型 如果使用ref 传递对象,修改值时候需要写为obj.value.attr 方式修改属性值 如果使用reactive 处理对象,直接obj.att…...
【自用】云服务器 docker 环境下 HomeAssistant 安装 HACS 教程
一、进入 docker 中的 HomeAssistant 1.查找 HomeAssistant 的 CONTAINER ID 连接上云服务器(宿主机)后,终端内进入 root ,输入: docker ps找到了 docker 的 container ID 2.config HomeAssistant 输入下面的命令&…...
使用dockerfile手动构建JDK11镜像运行容器并校验
Docker官方维护镜像的公共仓库网站 Docker Hub 国内无法访问了,大部分镜像无法下载,准备逐步构建自己的镜像库。【转载aliyun官方-容器镜像服务 ACR】Docker常见问题 阿里云容器镜像服务ACR(Alibaba Cloud Container Registry)是面…...
编程语言学习笔记-架构师和工程师的区别,PHP架构师之路
🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
