自定义数据类型——结构体

news2024/11/16 17:53:28

我们今天来简单介绍一下结构体。

目录

1. 结构体的声明

2. 结构体成员的访问

3. 结构体传参


首先我们要知道为什么会有结构体的存在,我们的生活里有很多东西,比如一只猫,一本书,一个人,我们如果要用程序来描述他们,应该怎么办呢?总不可能用一个char数组全部塞进去吧?这样修改也很不方便,比如一个人,有姓名,年龄,性别,工作单位,电话,家庭关系等等,这时候就出现了结构体,一个可以自定义的变量,我们来看一下结构体的相关内容。

1. 结构体的声明

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

1.1结构体的声明:

struct tag
{
 member-list;
}variable-list;

tag是标签名,根据自己的需求来修改,member-list是成员列表,结构体可以有1~N个成员。

1.2结构成员的类型:

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

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

我们来看这样一段代码:

typedef struct Stu
{
 char name[20];//名字
 int age;//年龄
 char sex[5];//性别
 char id[20];//学号
}Stu;

我们用结构体变量自定义了一个学生变量,一个学生有很多属性,我们取了其中的一部分。

typedef是重命名,我们在使用结构体时,初始化过于麻烦,比如上面的学生,我们如果想创建学生对象,可以这样做

int main() {
	struct Stu s1;
	Stu s2;
}

第一种方式是我们没有使用typedef时,要写一个struct,第二种是有了typedef后,可以直接使用重命名的变量名来使用。

 

我们还可以使用这样的方法,如上图中的s1,s2,s3 也是结构体变量的创建方法,我们可以直接在结构体变量后创建,也可以采用s4这样的方法创建,要注意的是,s1,s2,s3是全局变量,而s4是局部变量。

对于结构体,我们还可以这样

把结构体直接定义在函数里,不过这样,结构体就变成了局部变量,只能在该函数内部使用,我们既然创建结构体,就是为了在很多地方使用,所以我们不这样写。

 我们再来看看结构体如何初始化

#include <stdio.h>
struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
};

int main() {
	struct Stu s1 = { "张三",18,"男","10001" };
}

 我们可以这样直接用大括号对结构体初始化。也可以对结构体的成员进行访问从而初始化(或者修改结构体成员的数据)

2. 结构体成员的访问

结构变量的成员是通过点操作符   .   访问的。点操作符接受两个操作数。

如图,我们可以使用.来访问结构体的成员

有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。 那该如何访问成员?

 

 我们可以采用解引用加点操作符的方法,但这样过于麻烦,既然它是一个指针,那么c语言就允许使用->的方法,来指向结构体的成员,如上图所示

3. 结构体传参

结构体传参规则和其他数据传参规则是相同的,传值和传址的结果是不同的,我们来看代码

#include <stdio.h>
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;
}

传值的话,是拷贝一份临时变量,操作这份变量不改变原来的结构体,而传址可以改变原来的结构体,我们一般都是传址,而且print1和print2选一个的话,一定是print2好,因为函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。所以我们在使用结构体时,都是传址传递。

以上就是关于结构体的内容了,希望大家可以有所收获

如有错误,还请指正。

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

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

相关文章

C语言 指针

C语言 指针引言1. 什么是指针2. 简单认识指针3. 取地址符 & 和解引用 * 符一、指针与内存二、指针类型的存在意义1. 指针变量的大小2. 指针移动3. 不同指针类型的解引用三、指针运算1. 指针加减整数程序清单1程序清单22. 指针 - 指针3. 指针关系运算四、二级指针五、野指针…

这个双11,我薅了华为云会议的羊毛

文章目录前言华为云会议悄然助力各行各业和其他云会议产品相比&#xff0c;华为云会议优势是什么&#xff1f;云端一体线下会议室和云会议互通专业会管与会控能力更安全华为云会议有哪些 AI 能力&#xff1f;华为云会议入门有多简单&#xff1f;下载步骤如下安装加入会议预约会…

原生js 之 (DOM操作)

Web API Web API是浏览器提供的一套操作浏览器功能和页面元素的API(BOM和DOM) JavaScipt由三部分构成 ECMAScript、DOM和BOM。 BOM浏览器对象模型&#xff0c;提供了与浏览器的交互方法和接口&#xff1b; DOM 文档对象模型&#xff0c;提供了处理网页内容、结构 、样式的方法…

【数据结构】图的遍历

深度优先遍历 深度优先遍历思想 对于图&#xff1a;选中一个结点&#xff0c;访问和其相邻的、未被访问过的点&#xff0c;全部访问完毕后回退到上一个结点&#xff0c;直至全部结点访问完毕&#xff0c;类似于图的先序遍历&#xff0c;如有邻接表&#xff0c;则按邻接矩阵的顺…

一文熟悉 Go 的基础语法和基本数据类型

一文熟悉 Go 的基础语法和基本数据类型前言Hello&#xff0c;World&#xff01;有关 main 函数的一些要点关键字package声明引入基本数据类型整形数据类型有符号整数类型无符号整数类型其他整数类型浮点数据类型字符类型布尔类型字符串类型基本数据类型的默认值常量和变量声明结…

swift指针内存管理-指针类型使用

为什么说指针不安全 我们在创建一个对象的时候&#xff0c;是需要在堆上开辟内存空间的 但是这个内存空间的声明周期是有限的 也就意味着如果使用指针指向这块内存空间&#xff0c;当这块内存空间的生命周期结束&#xff08;引用计数为0&#xff09;&#xff0c;那么当前的指针…

mac m1 配置goland debbug

大概率无法使用goland的debug功能&#xff0c;如果自己安装没选对路径&#xff0c;也无法使用。原因是&#xff1a; go env 配置不对&#xff0c;需要指向 ARM64&#xff1b; dlv版本不对&#xff0c;需要使用 arm64 系列&#xff1b; dlv路径不对&#xff0c;需要使用 macarm…

Linux服务器使用git clone命令时报错的解决方案

在往GitHub上上传项目时&#xff0c;使用git clone xxxxx.git时候报错&#xff1a; “gnutls_handshake() failed: the TLS connection was non-properly terminated” 由系统的 git 默认使用的 libcurl4-gnutls-dev 造成&#xff0c;可以使用openssl解决. 但是这个过程也很多…

2022亚太B题赛题分享

高速列车的优化设计 2022年4月12日&#xff0c;中国高铁复兴CR450多机组成功实现单列列车速度435 km/h&#xff0c;相对速度870 km/h&#xff0c;创造了高铁多机组列车穿越明线和隧道速度的世界纪录。新一代标准动车组“复兴”是中国自主研发的具有全知识产权的新一代高速列车。…

Doris 5 处理Sentinel-1 生成干涉图 interferogram

Doris 5 处理Sentinel-1 Step 0 创建文件夹 首先创建一个文件夹用来准备数据处理&#xff0c;例如 “Doris_test1”&#xff0c;然后在该文件夹下创建五个文件夹&#xff0c;用来存放数据&#xff0c;例如 AOI (研究区的shp文件), archive_data (已下载的Sentinel-1 SLC文件&…

手部IK,自制动画,蒙太奇——开门手臂自动弯曲、靠墙手自动扶墙

开门手臂自动弯曲 实现效果&#xff1a;人物做出抬手的开门动画时&#xff0c;若手臂碰到静态网格物体&#xff0c;拳头不会穿过物体&#xff0c;而是会产生手臂IK弯曲动画效果。 重要参考资料&#xff1a; 学习UE4动画蓝图&#xff1a;配置手部IK_YakSue的博客-CSDN博客_ue…

ImageProvider工作流程和AssetImage 加载流程

Flutter 学习&#xff1a;ImageProvider工作流程和AssetImage 的自动分辨率适配原理https://cloud.tencent.com/developer/article/1748045上面流程为ImageProvider工作流程细节&#xff0c;作者已经写的很详细了&#xff0c;非常受用&#xff0c;现在接着上面作者内容讨论下As…

【32-业务开发-基础业务-规格参数-保存数据-查询数据-更新操作之数据回显展示-更新操作-前后端项目交互整合与测试-总结收获】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

1532_AURIX_TriCore内核架构_中断

全部学习汇总&#xff1a; GreyZhang/g_tricore_architecture: some learning note about tricore architecture. (github.com) 中断一直是我想了解关注的一个功能模块&#xff0c;因为感觉不同的芯片上这部分的设计差异比较大。而这部分也跟我们嵌入式软件的设计模式直接相关。…

使用HikariCP连接池常用配置讲解及注意事项

使用HikariCP连接池常用配置讲解及注意事项常遇到的几种错误Possibly consider using a shorter maxLifetime valueConnection is not available, request timed out after xxxxxmsNo operations allowed after connection closed常见配置及注释说明&#xff0c;可以使用并根据…

每日刷题2——指针概念

更新不易&#xff0c;麻烦多多点赞&#xff0c;欢迎你的提问&#xff0c;感谢你的转发&#xff0c; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我…

Twins: Revisiting the Design of Spatial Attention in Vision Transformers

Twins: Revisiting the Design of Spatial Attention in Vision Transformers一、引言二、Twins-PCPVT三、Twins-SVT四、实验五、消融实验文章链接: https://arxiv.org/abs/2104.13840代码链接: https://github.com/Meituan-AutoML/Twins一、引言 在本文中&#xff0c;重新审…

基于Matlab计算经典CFAR阈值

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

基于开源 PolarDB-X 打造中正智能身份认证业务数据基座

一、公司及业务介绍 中正智能是全球领先的生物识别和身份认证公司之一。我们曾负责公安部指纹算法国家标准的起草、编写&#xff0c;具备从算法、终端、平台、设计、生产、交付全域自研的能力&#xff0c;拥有多项自主知识产权的产品&#xff0c;并积极与高校合作开展基础研发。…

【Rust 指南】并发编程|无畏并发的原因

文章目录前言1、线程1.1、通过 spawn 创建新线程1.2、join 方法2、move 强制所有权迁移3、使用消息传递跨线程传递数据3.1、Send 方法3.2 、Sync 方法前言 安全高效的处理并发是 Rust 诞生的目的之一&#xff0c;主要解决的是服务器高负载承受能力。 并发&#xff08;concurren…