C语言结构体初级

news2024/10/6 22:26:29

目录

一、为什么要用结构体

二、使用结构体的具体形式

1.结构体类型的声明(main函数外部)

2.结构体变量的定义(在main函数内或者外) 

3.结构体变量的初始化

4.结构体成员的访问

5.结构体的传参


跑了这么久,再坚持一下吧

本专栏适用于有一定C语言基础并且还要继续学习的人 

往期回顾:

C语言函数详解

C语言操作符详解

C语言实现扫雷及进阶

C语言实现三子棋

C语言实现猜数字游戏

C语言for循环详解

C语言初学可能会遇到的问题(一)

文章质量在努力提高中...

本文将介绍结构体初级用法,内容比较简单,但会对以后更难的学习打下基础。当然结构体也是一种很方便的存储复杂变量的形式,非常实用

一、为什么要用结构体

为了描述一个复杂类型的变量,如一个学生的数据,通常包括:性别,成绩,身高,体重等,将这些数据都存入一个集合中,这个集合就叫结构体

二、使用结构体的具体形式

结构体要想有效,就得先声明,再使用。

1.结构体类型的声明(main函数外部)

结构体成员的类型也是根据实际情况来定的,一般要看结构体对象有那些属性,对应的数据类型为啥就定义为啥,结构的成员可以是标量、数组、指针,甚至是其他结构体

2.结构体变量的定义(在main函数内或者外) 

 同样,可以将相同结构体类型的结构体变量放入一个数组中

那么数组S的数组元素就成了S[0]和S[1],在后续使用结构体时可以直接引用数组名+下标代替变量名。如S[0]就相当于S1,S[1]就相当于S2。

第二种方法:在main函数外,结构体后定义结构体变量

特殊情况:使用typedef对结构体类型进行重定义

3.结构体变量的初始化

用大括号将结构体变量对应的所有结构体成员括起来,不同结构体成员之间用逗号隔开,如果是字符成员的话要用双引号引起来,按顺序对结构体变量进行初始化,如在结构体声明中先声明name,就要先初始化name,再声明age,就要再初始化age...

结构体按想要的顺序进行初始化的方法

按想要的顺序:.结构体成员名1=,.结构体成员2=   ....

4.结构体成员的访问

(.)结构体成员访问操作符1,使用方法:结构体变量.结构体成员

(->)结构体成员访问操作符2,使用方法:结构体指针变量->结构体成员

使用方法案例具体见下面的结构体传参

5.结构体的传参

函数的传参可以参考:C语言函数详解

直接上代码

struct S
{
 int data[1000];
 int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
 printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
 printf("%d\n", ps->num);
}
int main()
{
 print1(s);  //传结构体
 print2(&s); //传地址
 return 0;
}

代码讲解:结构体传参有两种方式:直接传结构体变量;传结构体变量的地址

将结构体变量直接传参上去后,用(.)操作符访问结构体成员即可;将结构体变量的地址作为参数传上去后用(->)操作符访问结构体成员。

传结构体变量地址的好处:

函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。而传地址的时候只需要传4/8个字节,相对来说非常划算(地址大小在32位机器上是4个字节大小,在64位机器上是8个字节大小)

所以在结构体传参的时候,要传地址

在这里插入图片描述

本文收录于水火莲花-C疑难专题           C语言学习专题​​​​​​

这两个专题可用于正在学习C语言,并且有一定基础的人,专栏持续免费更新中...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式软件架构——单体架构

序言 当一项大工程需要大量人员共同开发,并保证它们分布在网络中的大量服务器节点能够同时运行,那么随着项目规模的增大、运行时间变长,它必然会受到墨菲定律的无情打击。 Murphy’s Law:Anything that can go wrong will go wro…

Qt文件系统源码分析—第四篇QLockFile

深度 本文主要分析Windows平台,Mac、Linux暂不涉及 本文只分析到Win32 API/Windows Com组件/STL库函数层次,再下层代码不做探究 本文QT版本5.15.2 类关系图 QTemporaryFile继承QFile QFile、QSaveFile继承QFileDevice QFileDevice继承QIODevice Q…

法规标准-ISO 17361标准解读

ISO 17361是做什么的? ISO 17361全称为智能交通系统-车道偏离警告系统性能要求和测试程序,其中主要描述了LDWS系统的功能要求及测试要求 系统功能 车道偏离警告系统的功能元件应符合图中的要求,抑制请求、车速检测、驾驶员偏好和其他附加功…

[CTF/网络安全] 攻防世界 simple_js 解题详析

[CTF/网络安全] 攻防世界 simple_js 解题详析 代码分析代码漏洞姿势String[fromCharCode]总结 题目描述:小宁发现了一个网页,但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} ) 页面源代码: 代码分析 function dechiffre(pass_enc){…

StarRocks 集群模式搭建

一、StarRocks 集群模型搭建 上篇文章对 StarRocks 进行了简单的介绍及使用 Docker 进行了快速体验,本篇文章进行StarRocks 集群模型的搭建,下面是上篇文章的地址: StarRocks 极速全场景 MPP 数据库介绍及使用 部署规划 host主机名角色192.…

求解包含约束的最优化问题:拉格朗日乘子法和KKT条件

文章目录 无约束等式约束不等式约束KKT条件 无约束 之前梯度类算法中介绍的最速下降法、牛顿法和拟牛顿法,可以直接使用的条件之一为:决策变量都是无约束的。 用数学语言描述的话,可以表达为:决策变量为 x ( x 1 , x 2 , ⋅ ⋅…

LeetCode104. 二叉树的最大深度(递归非递归)

写在前面: 题目链接:LeetCode104.二叉树的最大深度 编程语言:C 题目难度:简单 一、题目描述 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子…

You Only Look Once:Unified,Real-Time Object Detection总结笔记

一、论文思想 1.将一个图像分成S*S个网格(grid cell),如果某个object的中心落在这个网格中,则这个网络就负责预测这个object。 2.每个网格要预测B个bounding box,每个bounding box除了要预测位置之外,还要…

微服务技术(SpringCloud、Docker、RabbitMQ)

目录 一、微服务技术简介 二、服务拆分及远程调用 1.Eureka注册中心 2.Nacos注册中心 3.Nacos配置管理 4.http客户端Feign 三、统一网关Gateway 四、Docker 五、异步通信技术 六、ElasticSearch 一、微服务技术简介 微服务是分布式架构(分布式&#xff…

Lesson14---卷积神经网络

14.1 深度学习基础 14.1.1 深度学习的基本思想 特征工程:尽可能选择和构建出好的特征,使得机器学习算法能够达到最佳性能。是机器学习的上限,而算法就是逼近这个上限传统的机器学习特证工程 依靠人工方式提取和设计特征需要大量的专业知识…

低代码系统前端实践之vue-element-admin运行demo

文章目录 1、简介2、实践功能3、实践过程3.0 下载运行demo3.1.1 解决执行npm install或出现以下报错(删掉组件tui-editor相关即可)3.1.2 解决执行npm run dev或出现no module body-parser(安装body-parser即可)3.1.3 解决执行npm run dev或出现error:0308010C:digital envelope…

RK3568平台开发系列讲解(驱动基础篇)RK平台I2C的使用

🚀返回专栏总目录 文章目录 一、I2C 使用情况二、定义和注册 I2C 设备三、定义和注册 I2C 驱动3.1 I2C 驱动定义3.2 I2C 驱动注册3.3 通过 I2C 收发数据沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将对RK I2C 的使用进行学习。 配置 I2C 可分为两大步骤: 定…

【Linux C】GCC编译 GDB调试 从入门到放弃 (gcc调试选项详解、gdb调试、条件断点、远程调试、脚本化调试)

阅读本文可能需要一些基础,比如:C语言基础、Linux基础操作、vim、防火墙等。篇幅有限,本文讲的“比较浅显”。 通过本文你将学会: gcc编译gdb调试 少年你渴望力量吗👇👇👇 一、使用GCC编译C程序…

Antd 下拉面板的位置计算错误

项目场景: 公司使用无界微前端集成ERP项目应用(可惜没跟着走一边无界,难受),某些子应用使用时,发现antd的弹窗弹出的位置不对。如下图: 问题描述 无界微前端嵌入的子应用中的antd的下拉框位置…

【谷粒商城笔记】基于docker的mysql、redis环境配置

0.系统 宝塔 v7.5.1 Centos v8.2 1. 安装Docker 直接yum install docker会提示找不到 > docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine Loaded plugins: fastestmirror No Match for argument: …

Prometheus如何优化远程读写的性能

Prometheus如何优化远程读写的性能 场景 为了解决prometheus本地存储带来的单点问题,我们一般在高可用监控架构中会使用远程存储,并通过配置prometheus的remote_write和remote_read来对接 远程写优化:remote_write 用户可以在Prometheus配…

码上行动:零基础学会Python编程(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

Day3 字符串中找出连续最长的数字串、数组中出现次数超过一半的数字

✨个人主页: 北 海 🎉所属专栏: C/C相关题解 🎃操作环境: Visual Studio 2019 版本 16.11.17 文章目录 选择题1、进程管理2、计算机组成原理 编程题1、字符串中找出连续最长的数字串2、数组中出现次数超过一半的数字 选…

和数组处理有关的一些OJ题;ArrayList 实现简单的洗牌算法(JAVA)(ArrayList)

接上次博客:数据结构初阶(2)(ArrayList简介、ArrayList()的构造方法、ArrayList的扩容、方法和三种遍历方法、ArrayList实现杨辉三角、ArrayList 的优缺点)_di-Dora的博客-CSDN博客 1、给你一个数组 nums 和一个值 va…

FreeRTOS(6)----软件定时器

一,软件定时器概述 软件定时器允许设置一段时间,当设定的时间到达之后就会执行指定的功能函数,被定时器调用的这个函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期。 二,回调函数的注意事项 回调函数是…