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

初阶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语言-结构体

&#x1f31e; “少年有梦不至于心动&#xff0c;更要付诸行动。” 今天我们一起学习一下结构体的相关内容&#xff01; 结构体 &#x1f388;1.结构体的声明1.1结构的基础知识1.2结构的声明1.3结构成员的类型1.4结构体变量的定义和初始化 &#x1f388;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数组&#xff0c;相对的在java开发中常用的数据结构是ArrayList和HashMap&#xff0c;它们可以看成是array的拆分&#xff0c;一种简单的对应关系为 PHPJAVAArray: array(1,2,3)ArrayListlArray: array(“name” > “jack”,“…...

Linux网络编程:网络基础

文章目录&#xff1a; 1.协议 2.锁 3.网络层次模型 4.以太网帧和ARP协议 5.IP协议 6.UDP协议 7.TCP协议 8.BS模式和CS模式 9.网络套接字(socket) 10.网络字节序 11.IP地址转换函数 12.sockaddr地址结构 学习Linux的网络编程原则上基于&#xff1a;Linux的系统编程…...

3D沉浸式旅游网站开发案例复盘【Three.js】

Plongez dans Lyon网站终于上线了。 我们与 Danka 团队和 Nico Icecream 共同努力&#xff0c;打造了一个令我们特别自豪的流畅的沉浸式网站。 这个网站是专为 ONLYON Tourism 和会议而建&#xff0c;旨在展示里昂最具标志性的活动场所。观看简短的介绍视频后&#xff0c;用户…...

IO的几个模型

I/O模型名词介绍 说到I/O模型&#xff0c;都会牵扯到同步、异步、阻塞、非阻塞这几个词&#xff0c;以下讲解这几个词的概念。 阻塞和非阻塞 阻塞和非阻塞指的是一直等还是可以去做其他事。 阻塞&#xff08;blocking&#xff09;&#xff1a;调用结果返回之前&#xff0c;…...

中路对线发现正在攻防演练中投毒的红队大佬

背景 2023年8月14日晚&#xff0c;墨菲安全实验室发布《首起针对国内金融企业的开源组件投毒攻击事件》NPM投毒事件分析文章&#xff0c;紧接着我们在8月17日监控到一个新的npm投毒组件包 hreport-preview&#xff0c;该投毒组件用来下载木马文件的域名地址竟然是 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目录&#xff0c;执行&#xff1a; ./spark-shell 输出中有这么一行&#xff1a; Spark context Web UI available at http://xx.xx.xx.188:4040意味着我们可以从web页面查看spark的运行情…...

什么是边车

名词和概念定义 Sidecar&#xff1a;边车。微服务中数据平面的进程&#xff0c;负责转发应用、服务请求&#xff0c;并支持限流、熔断、负载均衡等特性。 Control-plane: 控制平面。微服务的配置中心&#xff0c;负责配置下发、数据搜集、服务发现等功能。 应用: 应用是指服务…...

vue项目打包成exe文件

1. 获取electron-quick-start demo git clone https://github.com/electron/electron-quick-start2. 安装依赖包 npm install 或 npm i // 安装依赖时可能会遇到node版本的问题&#xff0c;需要切换node版本的可以先看下nvm&#xff0c;简单易操作3. 打包项目&#xff08;需要…...

基于MFCC特征提取和GMM训练的语音信号识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 MFCC特征提取 4.2 Gaussian Mixture Model&#xff08;GMM&#xff09; 4.3. 实现过程 4.4 应用领域 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3…...

client-go实战之十二:选主(leader-election)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《client-go实战》系列的第十二篇&#xff0c;又有一个精彩的知识点在本章呈现&#xff1a;选主(leader-election)在解释什么是选主之前&…...

2023年即将推出的CSS特性对你影响大不大?

Google开发者大会每年都会提出有关于 Web UI 和 CSS 方面的新特性&#xff0c;今年又上新了许多新功能&#xff0c;今天就从中找出了影响最大的几个功能给大家介绍一下 :has :has() 可以通过检查父元素是否包含特定子元素或这些子元素是否处于特定状态来改变样式&#xff0c;也…...

opencv实战项目-停车位计数

手势识别系列文章目录 手势识别是一种人机交互技术&#xff0c;通过识别人的手势动作&#xff0c;从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪&#xff08;定位手部关键点&#xff09; 2.opencv实战项目 实现手势跟踪并返回位置信息&a…...

NLP文本匹配任务Text Matching [无监督训练]:SimCSE、ESimCSE、DiffCSE 项目实践

NLP文本匹配任务Text Matching [无监督训练]&#xff1a;SimCSE、ESimCSE、DiffCSE 项目实践 文本匹配多用于计算两个文本之间的相似度&#xff0c;该示例会基于 ESimCSE 实现一个无监督的文本匹配模型的训练流程。文本匹配多用于计算两段「自然文本」之间的「相似度」。 例如…...

复习vue3,简简单单记录

这里的知识是结合视频以及其他文章一起学习&#xff0c;仅用于个人复习记录 ref 和reactive ref 用于基本类型 reactive 用于引用类型 如果使用ref 传递对象&#xff0c;修改值时候需要写为obj.value.attr 方式修改属性值 如果使用reactive 处理对象&#xff0c;直接obj.att…...

【自用】云服务器 docker 环境下 HomeAssistant 安装 HACS 教程

一、进入 docker 中的 HomeAssistant 1.查找 HomeAssistant 的 CONTAINER ID 连接上云服务器&#xff08;宿主机&#xff09;后&#xff0c;终端内进入 root &#xff0c;输入&#xff1a; docker ps找到了 docker 的 container ID 2.config HomeAssistant 输入下面的命令&…...

使用dockerfile手动构建JDK11镜像运行容器并校验

Docker官方维护镜像的公共仓库网站 Docker Hub 国内无法访问了&#xff0c;大部分镜像无法下载&#xff0c;准备逐步构建自己的镜像库。【转载aliyun官方-容器镜像服务 ACR】Docker常见问题 阿里云容器镜像服务ACR&#xff08;Alibaba Cloud Container Registry&#xff09;是面…...

编程语言学习笔记-架构师和工程师的区别,PHP架构师之路

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...