零基础玩转C语言—结构体【初阶】

news2024/10/6 6:04:07

大家好,我是深鱼~

目录

【前言】:

一、结构体的声明

1.1结构的基本知识

1.2结构的声明

1.3结构体成员的类型

1.4结构体变量的定义和初始化

二、结构体成员的访问


【前言】:本章来介绍结构体的部分知识,并不会深入讲解,只是初阶部分,看得懂结构体的逻辑,并且会简单的运用,后期进阶部分还会深入讲解,希望对大家有所帮助

一、结构体的声明

1.1结构的基本知识

结构是一些值的集合,这些值称为成员变量,结构的每一个成员可以是不同类型的变量

这就让我们想起来数组:一组相同类型元素的集合

1.2结构的声明

struct tag             //结构体关键字+名字(根据实际情况自己命名)

{

member-list;        //成员变量的列表(一个或多个)

}variable-list        //变量列表

为什么要出现结构体呢?

当前学习过的类型都是内置类型,eg:char,int,short,double...但是如果我们想要用一个类型来创建一个复杂对象,比如人:继续要名字+性别+年龄+电话+地址+...这时C语言就引进了结构体这个类型来创建复杂对象(对于一个变量,我们首先得有一个类型来创建这个变量,然后再把值存入变量中去)

 假如我们要创建学生的变量:

学生类型——>  学生的变量——>   学生的属性信息

代码实现:

#include<stdio.h>
struct Stu
{
	//学生的相关的属性
	char name[20];
	int age;
	char sex[5];
	char tele[12];
}s3,s4;           //这里的s3,s4是变量名
struct Stu s5;     //这样创建全局变量也是可以的
int main()
{
	struct Stu s1;  //注意这里类型是struct Stu(struct是不可以省略的)
	struct Stu s2;
	return 0;
}

上面一个创建了s1,s2,s3,s4,s5五个变量,但是s1,s2是局部变量s3,s4,s5是全局变量

如果我们想要简化变量的类型重命名

typedef struct Stu
{
	//学生的相关的属性
	char name[20];
	int age;
	char sex[5];
	char tele[12];
}Stu;    //Stu是重命名产生的新的类型
int main()
{
	Stu s5;
	return 0;
}

typedef是类型重定义,就是把类型的名字重命名

【注意】上一个代码中s3,s4是变量名,而这个代码中Stu是重命名产生的新类型

1.3结构体成员的类型

结构体成员可以是标量,数组,指针,甚至可以是其他结构体

代码演示:我们可以看到结构体成员还是比较丰富的

struct B
{
	char c;
	int i;
};
struct S
{
	char c;
	int num;
	int arr[10];
	double* pd;
	struct B sb;
	struct B* pb;
};
int main()
{
	return 0;
}

1.4结构体变量的定义和初始化

定义:

全局变量的创建有两种:

(1)直接在结构体声明分号之前的加上变量名;

(2)在结构体声明结束后,跟局部变量创建一样些,但是不写在main函数中

初始化:

(1)按照顺序初始化:跟数组一样用{ },中间根据成员顺序输入进行初始化

(2)指定成员初始化:这样就得加上成员的名称eg:.num=1000,其他没有初始化的部分默认为0

代码演示如下:

struct B
{
	char c;
	int i;
};
struct S
{
	char c;
	int num;
	int arr[10];
	double* pd;
	struct B sb;
	struct B* pb;
}s1;  //s1是全局变量(第一种)

struct S s2;//s2是全局变量(第二种)

int main()
{
	double d = 3.14;
    //按照顺序初始化
	struct S s3 = { 'q',100,{1,2,3},&d,{'a',1},NULL };//局部变量
    //指定成员来初始化
    struct S s4={.num=1000,.arr={1,2,3,4,5}};
	return 0;
}

二、结构体成员的访问

·结构体变量.成员名

·结构体指针->成员名

 代码演示:【写一个函数给s存放数据】

#include<string.h>
struct S
{
	char name[20];
	int age;
};
void set_s(struct S* ps) 
{
	(*ps).age = 18;
	strcpy((*ps).name, "zhangsan");//字符串拷贝
	//(*ps).name = "zhangsan";这是错误的,因为name是数组名,数组名是地址常量
}
int main()
{
	struct S s = { 0 };
	//写一个函数给s种存放数据
	set_s(&s);

	return 0;
}

这里要注意两个点:

(1)在name(数组成员)中存放数据的时候,我们不能像age一样直接存放

因为name是数组名,数组名是地址常量,就相当于我们是把张三放到了一个门牌号上,并没有放入房间里,所以我们就用strcpy函数来存放数据

(2)在传参的时候不能直接传个过去,而要把s的地址(&s)传进去:

实参传给形参的时候,实参只是实参的一份临时拷贝,对形参的修改不会影响实参

上面是用结构体变量.成员名这个方法来存放数据的

其实也可以这样:指针直接指向成员名更好理解一点

ps->age=18;
strcpy(ps->name,"zhangsan");

下面再来【写一个函数打印s中的数据】:这里传参直接传结构体变量s就可以,只是打印不用带回main函数,其实这里传地址也可以,这其实也是更好的选择

struct S
{
	char name[20];
	int age;
};
void print_s(struct S t)
{
	printf("%s %d\n", t.name, t.age);
}
void set_s(struct S* ps)
{
	ps->age = 18;
	strcpy(ps->name, "zhangsan");//字符串拷贝
}
int main()
{
	struct S s = { 0 };
	/*写一个函数给s种存放数据*/
	set_s(&s);
	//写一个函数打印s中的数据
	print_s(s);
	return 0;
}

【总结】:结构体传参的时候,要传结构体的地址

(1)当传参时传的是变量时,我们能做的事就很少,因为形参只是实参是一份临时拷贝,对形参进行操作并不改变实参;但是直接传地址过去,我们能干的就很多

(2)当我们传变量的时候,拷贝一份实参也是需要空间的

而直接传地址,直接对原参数进行操作,不需要多余的空间,大大提高了效率

 这次结构体的内容就到此啦,有什么问题欢迎评论区或者私信交流,觉得笔者写的还可以,或者自己有些许收获的,麻烦铁汁们动动小手,给俺来个一键三连,万分感谢 !

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

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

相关文章

webstorm格式化代码后单引号转成了双引号

webStorm格式化js代码时单引号变成了双引号&#xff0c;问题如下&#xff1a; 格式化前&#xff1a; 格式化后&#xff1a; 解决办法&#xff1a; window: File -> Settings -> Editor -> Code Style -> Javascript&#xff1b; mac: webStorm -> Preference …

了解回归测试吗?今天给大家详解一下回归测试

测试工作中&#xff0c;新人对于测试流程、测试方法都有可以直接拿来用的教材&#xff0c;但是对于回归测试中的bug处理的细节&#xff0c;往往需要我们更多的经历才能更好的完成自己的工作&#xff0c;下面我们来谈一谈回归测试bug的处理中需要关注的点&#xff1a; 一、什么…

Docker 镜像解密:分层存储与镜像构建原理

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

国内办公协作系统评测:5 款软件推荐

办公协作系统是现代信息化办公的必备工具之一&#xff0c;对于企业来说&#xff0c;选择一款好用的办公协作系统非常重要。然而&#xff0c;在众多的办公协作系统中&#xff0c;哪个好用是一个让人头痛的问题。总体而言&#xff0c;国内的办公协作系统已经相当成熟和完善&#…

基于linux下的高并发服务器开发(第四章)- 多线程实现并发服务器

>>了解文件描述符 文件描述符分为两类&#xff0c;一类是用于监听的&#xff0c;一类是用于通信的&#xff0c;在服务器端既有监听的&#xff0c;又有通信的。而且在服务器端只有一个用于监听的文件描述符&#xff0c;用于通信的文件描述符是有n个。和多少个客户端建立了…

vue 前端一键导出excel文件并附带表格样式

1、安装xlsx、xlsx-style、file-saver三个包 //xlsx与file-saver指定版本安装&#xff0c;解决默认安装utils未定义的问题 npm install --save xlsx0.17.0 npm install --save file-saver2.0.5 npm install xlsx-style --save 2、在使用的页面引入 import XLSX from xlsx //…

对顶堆算法

对顶堆可以动态维护一个序列上的第k大的数&#xff0c;由一个大根堆和一个小根堆组成&#xff0c; 小根堆维护前k大的数(包含第k个)大根堆维护比第k个数小的数 [CSP-J2020] 直播获奖 题目描述 NOI2130 即将举行。为了增加观赏性&#xff0c;CCF 决定逐一评出每个选手的成绩&a…

【暑期每日一练】 day10

目录 选择题 &#xff08;1&#xff09; 解析&#xff1a; &#xff08;2&#xff09; 解析&#xff1a; &#xff08;3&#xff09; 解析&#xff1a; &#xff08;4&#xff09; 解析&#xff1a; &#xff08;5&#xff09; 解析&#xff1a; 编程题 题一 …

Klipper seria.c 文件代码分析

一. 前言 Klipper 底层硬件的串口模块程序写的是否正确是决定下位机与上位机能否正常通信的前提&#xff0c;如果这个文件的驱动没写好&#xff0c;那上位机控制下位机就无从谈起&#xff0c;更无法通过上位机去验证下位机程序的正确性。 本篇博文将详细解析 Klipper src 文件夹…

提词器怎么用?这个方法看一看

提词器怎么用&#xff1f;在现代社会中&#xff0c;提词器的应用场景非常广泛。除了学习、工作、听力障碍和翻译&#xff0c;它还可以应用于其他领域&#xff0c;如演讲、广播、新闻报道等。比如说&#xff0c;在演讲中&#xff0c;提词器可以帮助演讲者更好地掌握演讲内容。演…

网络防御之VPN

配置IKE 第一阶段 [r1]ike proposal 1 [r1-ike-proposal-1]encryption-algorithm aes-cbc-128 [r1-ike-proposal-1]authentication-algorithm sha1 [r1-ike-proposal-1]dh group2 [r1-ike-proposal-1]authentication-method pre-share[r1]ike peer aaa v1 [r1-ike-peer-aaa…

提升数据质量的四大有效方式

在数字时代的今天&#xff0c;企业对于高质量、值得信赖的数据的需求越来越高。 目前&#xff0c;已经有很多企业将数据质量视为技术问题而非业务问题&#xff0c;这也是获取高质量数据的最大限制因素。只有查找技术缺陷&#xff0c;例如重复数据、缺失值、乱序序列&#xff0…

api自动化测试

API测试已成为日常的测试任务之一&#xff0c;为了提高测试效率&#xff0c;减少重复的手工操作&#xff0c;API自动化测试也逐渐变得愈加重要&#xff0c;本文是自己在API自动化测试方面的一些经验积累和心得、汇总成文&#xff0c;以飨读者 我相信自动化技能已经成为高级测试…

uniapp跨域解决

uniapp跨域解决 跨域是什么 跨域指的是浏览器不能执行其他网站的脚本&#xff0c;当一个网页去请求另一个域名的资源时&#xff0c;域名、端口、协议任一不同&#xff0c;就会存在跨域。跨域是由浏览器的同源策略造成的&#xff0c;是浏览器对JavaScript施加的安全限制。 报错…

直线导轨的精密等级以及划分依据

直线导轨的作用&#xff0c;是用来支撑和引导运动部件&#xff0c;按给定的方向做往复直线运动的&#xff0c;直线导轨是高精密度的传动元件&#xff0c;广泛使用在各行各业中。 直线导轨的精密等级是判断产品质量的一个重要指标。在众多种类的直线导轨产品中&#xff0c;精密等…

【BASH】回顾与知识点梳理(一)

【BASH】回顾与知识点梳理 一 前言一. 认识与学习 BASH1.1 硬件、核心与 Shell1.2 为何要学文字接口的 shell&#xff1f;1.3 系统的合法 shell 与 /etc/shells 功能1.4 Bash shell 的功能1.5 查询指令是否为 Bash shell 的内建命令&#xff1a; type1.6 指令的下达与快速编辑按…

vue3搭建Arco design UI框架

技术&#xff1a;Vue3.2.40 UI框架&#xff1a;Arco design 2.44.7 需要安装:yarn 1.22.19 和npm 8.19.4 1.第一步安装本地全局arco脚手架 管理员运行CMD npm i -g arco-cli安装成功后如下&#xff1a; 2.第二步在需要存放项目的文件夹拉取项目 我这里把项目存放在 D:\W…

CTF:信息泄露.(CTFHub靶场环境)

CTF&#xff1a;信息泄露.&#xff08;CTFHub靶场环境&#xff09; “ 信息泄露 ” 是指网站无意间向用户泄露敏感信息&#xff0c;泄露了有关于其他用户的数据&#xff0c;例如&#xff1a;另一个用户名的财务信息&#xff0c;敏感的商业 或 商业数据 &#xff0c;还有一些有…

【枚举+结论】icpc2022 济南 A

Problem - A - Codeforces 题意&#xff1a; 思路&#xff1a; 本来的思路是这样的 考虑最后会变成什么数&#xff0c;手摸了几个发现&#xff0c;都是2&#xff0c;不论本来的集合是不是包含2 然后就是猜测是不是直接变成2就好了 然后要去掉m个&#xff0c;直接考虑去掉最…

高速过孔同进同出?到底是什么一种设计体验

高速先生成员--黄刚 每当来一个比较新的概念时&#xff0c;高速先生总是非常的喜欢&#xff0c;随之而来的求知欲也会爆发个小宇宙。其实问题的来源是我们公司的北京分部的资深设计工程师&#xff0c;北京分部本身也是我司全国20多个分部里设计能力最强的分部之一了&#xff0c…