当前位置: 首页 > 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;项目技术负责…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...