初阶C语言——结构体【详解】
文章目录
- 1. 结构体的声明
- 1.1 结构的基础知识
- 1.2 结构的声明
- 1.3 结构成员的类型
- 1.4 结构体变量的定义和初始化
- 2. 结构体成员的访问
- 3. 结构体传参
1. 结构体的声明
1.1 结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.2 结构的声明
struct tag
{member-list;
}variable-list;
例如描述一本书:
第一种写法
struct Book
{//成员变量char name[20];//名字int price;//价格
};//分号不能丢
第二种写法
struct Book
{char name[20];int price;
}b1,b2,b3;//变量
第三种写法
typedef struct Book//typedef对类型重命名
{char name[20];int price;
}Book;
1.3 结构成员的类型
结构的成员可以是标量、数组、指针,甚至是其他结构体。
1.4 结构体变量的定义和初始化
看代码:
#include <stdio.h>
struct S
{char c;char arr[10];int* p;
}s1, s2; // 声明类型的同时定义变量s1,s2struct S s3;//全局变量struct B
{int a;struct S s;double d;
}sb1, sb2;struct B sb3;int main()
{//初始化:定义变量的同时赋初值struct S s4 = {'c', "zhangsan", NULL};//局部变量,并对其初始化int a = 10;struct B sb4 = { 100, {'q', "lisi", &a}, 3.14};return 0;
}
2. 结构体成员的访问
- 结构体变量访问成员
结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。
例如:
#include <stdio.h>
struct Book
{char name[20];int price;
};
int main()
{struct Book b1 = { "C结构体",66 };struct Book b2 = { .price = 88,.name = "C++" };//结构体变量.结构体成员printf("%s %d\n", b1.name, b1.price);printf("%s %d\n", b2.name, b2.price);return 0;
}
- 结构体指针访问指向变量的成员
有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。
那该如何访问成员。
如下:
#include <stdio.h>
struct Stu
{char name[20];int age;
};
void print(struct Stu* ps)
{printf("name = %s age = %d\n", (*ps).name, (*ps).age);//使用结构体指针访问指向对象的成员printf("name = %s age = %d\n", ps->name, ps->age);
}
int main()
{struct Stu s = { "zhangsan", 20 };print(&s);//结构体地址传参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;
}
上面的 print1 和 print2 函数哪个好些?
答案是:首选print2函数。
原因:
函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的 下降。
结论:
结构体传参的时候,要传结构体的地址
相关文章:
初阶C语言——结构体【详解】
文章目录1. 结构体的声明1.1 结构的基础知识1.2 结构的声明1.3 结构成员的类型1.4 结构体变量的定义和初始化2. 结构体成员的访问3. 结构体传参1. 结构体的声明 1.1 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 …...
盘点:9款身份和访问管理工具
身份和访问管理(IAM)长期以来一直是安全领导者职业生涯的关键“试炼场”,许多人在身份技术部署方面做出了事关成败的决定。 确保安全访问和身份管理是网络安全态势的两大基础 。同时,人员、应用程序和系统登录的方式以及它们彼此集…...
Linux下的进程地址空间
Linux下的进程地址空间程序地址空间回顾从代码结果推结论引入进程地址空间页表为什么要有进程地址空间重新理解进程地址空间程序地址空间回顾 我们在初学C/C的时候,我们会经常看见老师们画这样的内存布局图: 可是这真的是内存吗? 如果不是它…...
Web Spider Ast-Hook 浏览器内存漫游 - 数据检索
文章目录一、资源下载二、通过npm安装anyproxy模块三、anyproxy的介绍以及基本使用1. anyproxy的功能介绍2. anyproxy的基本使用四、给浏览器挂代理五、实操极验demo案例总结提示:以下是本篇文章正文内容,下面案例可供参考 一、资源下载 Github&#x…...
开源启智,筑梦未来!第四届OpenI/O启智开发者大会开幕
2023年2月24日,第四届OpenI/O启智开发者大会在深圳顺利开幕。本次活动由鹏城实验室、新一代人工智能产业技术创新战略联盟(AITISA)主办,OpenI启智社区、中关村视听产业技术创新联盟(AVSA)承办,华…...
CS144-Lab6
概述 在本周的实验中,你将在现有的NetworkInterface基础上实现一个IP路由器,从而结束本课程。路由器有几个网络接口,可以在其中任何一个接口上接收互联网数据报。路由器的工作是根据路由表转发它得到的数据报:一个规则列表&#…...
最好的个人品牌策略是什么样的
在这个自我营销的时代,个人品牌越来越受到人们的重视。您的个人品牌的成功与否取决于您在专业领域拥有的知识,以及拥有将这些知识传达给其他用户的能力。如果人们认为您没有能力并且无法有效地分享有用的知识,那么您就很难获得关注并实现长远…...
第四届国际步态识别竞赛HID2023已经启动,欢迎报名
欢迎参加第四届HID 2023竞赛,证明您的实力,推动步态识别研究发展!本次竞赛的亮点:总额人民币19,000元奖金;最新的SUSTech-Competition步态数据集;比上一届更充裕的准备时间;OpenGait开源程序帮您…...
「2」指针进阶——详解
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 🐰指向函数指针数组的指针(很少用,了解) 🐰回调函数&…...
计网笔记 网络层(端到端的服务)
第三章 网络层(端到端的服务) **TCP/IP体系中网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。**网路层不提供服务质量的承诺,不保证分组交付的时限,所传送的分组可能出错、丢失、重复和失序。进程之间通信的…...
[蓝桥杯 2018 省 B] 日志统计——双指针算法
题目描述小明维护着一个程序员论坛。现在他收集了一份“点赞”日志,日志共有 N 行。其中每一行的格式是 ts id,表示在 ts 时刻编号 id 的帖子收到一个“赞”。现在小明想统计有哪些帖子曾经是“热帖”。如果一个帖子曾在任意一个长度为 DD 的时间段内收到…...
SpringMVC请求转发和重定向
请求转发:forward:重定向:redirect转发:由服务器的页面进行跳转,不需要客户端重新发送请求:特点如下:1、地址栏的请求不会发生变化,显示的还是第一次请求的地址2、请求的次数,有且仅…...
如何建立项目标准化评价体系?【锦狸】
PMO团队面临着管理多个项目,甚至是多个项目集,多个产品集的问题,那么如何对项目们进行标准化评价体系的建设,就是PMO需要首先思考的问题。 首先我们要关注项目的背景,了解了项目背景之后,我们才可以明确项…...
Vue基础入门讲义(二)-语法基础
文章目录1.vue入门案例1.1.HTML模板1.2.vue渲染1.3.双向绑定1.4.事件处理2.Vue实例2.1.创建Vue实例2.2.模板或元素2.3.数据2.4.方法3.生命周期钩子3.1.生命周期3.2.钩子函数3.3.this1.vue入门案例 1.1.HTML模板 在项目目录新建一个HTML文件 01-demo.html 1.2.vue渲染 01-d…...
应广单片机用8位乘法器实现16位乘法运算
应广单片机例如pms150,pms152这种是没有带乘法器的,如果需要进行乘法运算,可以用ide里面“程序产生器”菜单里面 产生乘法函数,把数据填入对应的参数,然后调用函数就可以实现乘法运算了。除此之外,应广还有…...
Android中使用GRPC简明教程
引言 Android作为一个开发平台,本身是使用java进行封装的,因此java可以调用的库,在Android中同样可以进行调用,这样就使得Android设备具有丰富的功能,可以进行各种类型的开发。 这篇文章就介绍如何在Android设备中使…...
【Linux】使用U盘自动化安装Linux(VMware虚拟机)
文章目录前言一、准备二、新建虚拟机2.1 创建虚拟机2.2 新增硬盘2.3 系统启动项三、加电运行四、EFI方式五、总结前言 一、准备 基于之前的基础【Linux】Kickstart 配置U盘自动化安装Linux系统,现在我们可以在虚拟机中尝试自动化安装Linux系统。 二、新建虚拟机 …...
内网渗透(五十七)之域控安全和跨域攻击-基于服务账户的非约束委派攻击
系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…...
gitlab 安装到项目上传一篇解决
文章目录1.安装1.1创建挂载目录1.2启动1.3 配置gitlab查看docker admin 账户初始密码注册普通用户2.1进入注册2.2创建后通过登录admin审批3.2 步骤13.2 步骤23.3步骤33.4 项目添加成员4 使用成员用户,上传到新建的项目中4.1 复制项目地址4.2使用 git here 克隆项目4.3进入下载目…...
Verilog 逻辑与()、按位与()、逻辑或(||)、按位或(|)、等于(==)、全等(===)的区别
逻辑与(&&)逻辑与是一个双目运算符,当符号两边为1时输出1,符号两边为0时输出0。真值表:&&01xz00000101xxx0xxxz0xxx两个4bit的数字相与;A4b0x1z;B4b01xx;C4b00xz&am…...
payload-dumper-go实战案例:解决Android系统更新提取难题
payload-dumper-go实战案例:解决Android系统更新提取难题 【免费下载链接】payload-dumper-go an android OTA payload dumper written in Go 项目地址: https://gitcode.com/gh_mirrors/pa/payload-dumper-go Android系统更新通常以OTA(Over-the…...
电视盒子视频播放难题如何破解?TVBoxOSC带来流畅观影体验
电视盒子视频播放难题如何破解?TVBoxOSC带来流畅观影体验 【免费下载链接】TVBoxOSC TVBoxOSC - 一个基于第三方项目的代码库,用于电视盒子的控制和管理。 项目地址: https://gitcode.com/GitHub_Trending/tv/TVBoxOSC 客厅里的电视盒子本应是家庭…...
OneMore插件:3大核心功能让OneNote效率提升300%
OneMore插件:3大核心功能让OneNote效率提升300% 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore 传统笔记管理vs智能插件:效率差距在哪里&#…...
C语言入门避坑指南:从雨课堂高频错题解析编程新手常见误区
C语言入门避坑指南:从雨课堂高频错题解析编程新手常见误区 刚接触C语言时,很多同学会被看似简单的语法规则绊倒。那些在课堂上反复强调的细节,往往成为考试中最容易丢分的陷阱。本文将结合电子科技大学《程序设计与算法基础I》课程的真实错题…...
Captain AI vs DeepSeek:Ozon 卖家专属 AI,垂直深耕更懂俄语区
做Ozon跨境,选 AI 工具别只看 “全能”,更要看 “专业”和“精通”。DeepSeek 是通用型跨境AI,覆盖多平台、多场景;而Captain AI是Ozon垂直定制 AI,聚焦俄语区与Ozon规则,四大核心功能精准解决卖家从新品到…...
USB设备映射混乱?三招教你通过终端识别/dev/ttyUSB*对应的物理插槽
USB设备映射混乱?三招教你通过终端识别/dev/ttyUSB*对应的物理插槽 当你的工作台上同时连接着五个相同型号的温湿度传感器,系统却将它们随机分配为/dev/ttyUSB0到4时,那种抓狂的感觉每个物联网开发者都深有体会。上周调试智能农业大棚时&…...
VideoAgentTrek-ScreenFilter视觉盛宴:处理4K超高清屏幕录像的效果与性能挑战
VideoAgentTrek-ScreenFilter视觉盛宴:处理4K超高清屏幕录像的效果与性能挑战 最近在折腾一些屏幕录像的后期处理,特别是那些4K分辨率、高帧率的超高清素材。说实话,直接处理这种级别的视频,对硬件和软件都是不小的考验。我试用了…...
手把手教你用Global Mapper搞定大范围遥感影像:从按县界裁剪到自动切片分发的完整流程
大范围遥感影像工程化处理实战:Global Mapper全流程解决方案 当面对覆盖全省的Sentinel-2影像时,大多数GIS工程师的第一反应可能是打开QGIS或ArcGIS Pro,配合GDAL命令行工具完成从裁剪到分发的全流程。但今天我要分享的是一条更高效的路径——…...
Git Diff View:三分钟学会实用的代码差异对比组件
Git Diff View:三分钟学会实用的代码差异对比组件 【免费下载链接】git-diff-view A Diff View component for React / Vue, just like Github 项目地址: https://gitcode.com/gh_mirrors/gi/git-diff-view 你是否曾经在代码审查中为理解复杂的Git差异而头疼…...
别再只用L1/L2了!用PyTorch实战图像修复的5种高阶损失函数(含VGG19感知损失代码)
超越L1/L2:PyTorch图像修复中5种高阶损失函数的工程实践 当你在深夜调试一个图像超分辨率模型时,发现生成的图片虽然PSNR值很高,但总感觉缺少那种"真实感"——边缘不够锐利,纹理略显模糊。这时候,L1/L2损失函…...
