【C语言初阶-结构体】关于结构体的声明定义、结构体传参详解

目录

1. 结构体的声明

1.1 结构的基础知识

1.2 结构的声明

1.3 结构成员的类型 

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

2. 结构体成员的访问

2.1(.)操作符

2.2(->)操作符

 3.结构体传参


1. 结构体的声明

1.1 结构的基础知识

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

对比数组,数组是一类同类型的值的结合

1.2 结构的声明

struct tag

{

member-list;//结构体成员(属性)列表

}variable-list;//创建的结构体类型变量列表

例如描述一个学生:

struct Stu

{

char name[20];//名字

int age;//年龄

char sex[5];//性别

char id[20];//学号

};//分号不能丢

1.3 结构成员的类型 

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

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

我们先创建一个结构体:

struct Stu

{

char name[20];//名字

int age;//年龄

char sex[5];//性别

char id[20];//学号

};//分号不能丢

因为我们创建的的是一个类型,结构体类型,他和整型,浮点型这些类型的含义是一样的,那比如我们就利用上面的学生结构体类型来创建一个个变量:

struct Stu  s1;//这个是s1就是一个结构体变量,他的类型是struct Stu

这是单独创建的办法,当然也可以在创建结构体类型的时候就直接创建变量:

struct Stu

{

char name[20];//名字

int age;//年龄

char sex[5];//性别

char id[20];//学号

}s2;//分号不能丢

//这里的上s2就是创建的结构体类型的变量,类型是struct Stu

有时候如果我们觉得,在创建变量的时候,要写出完整的结构体类型比如上面的s1变量的创建觉得有些麻烦,那我们就可以对结构体类型进行类型重定义:

typedef struct Stu

{

char name[20];//名字

int age;//年龄

char sex[5];//性别

char id[20];//学号

}Stu;//分号不能丢 

//这里的Stu就是我们重定义的类型

Stu = struct Stu

我们这次创建S1变量的时候就可以这样写:

Stu s1 ;

那我们对于上述结构体初始化:结构体初始化使用{}

1.struct Stu s1 = {0};//这种就是直接简单粗暴把所有的值都初始化为0

2.struct  Stu s2 = {"zhangsan",10,男,1234};//这里我们就初始化好了一个结构体变量

 对于我们结构体嵌套结构体的定义和初始化:

struct Point

{

int x;

int y;

};

struct Node

{ int data;

struct Point p;

struct Node* next;

}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化

struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化

2. 结构体成员的访问

2.1(.)操作符

结构体成员的访问使用‘.’操作符

点操作符接受两个操作数。

 首先我们创建一个结构体变量:

struct Stu
{
int age ;
char name[20];
};

现在我想对结构体的两个成员单独赋值应该怎么做呢?

理由点操作符: 

//先创建一个结构体类型变量
struct Stu s1 ;
//对年龄进行赋值
s1.age = 20;
//对名字进行赋值
s1.name = [20];

2.2(->)操作符

结构体指针访问指向变量的成员 有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。 那该如何访问成员。(因为有时结构体作为函数参数进行传参就会传递结构体的地址,这个时候就会用到结构体类型的指针,下面讲) 如下:

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.结构体传参

当结构体作为函数参数进行传递是,可以用结构体类型参数进行接收,相当于在函数中拷贝一份一模一样的结构体,也可以传地址,用指针进行操作,如下:

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.rhkb.cn/news/255802.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

S32 Design Studio的PE工具

S32 Design Studio软件是NXP公司专门为了方便用户开发S32K1系列芯片的IDE,跟Eclipse比较像。里面有个配套的图形工具Processor Expert,会产生一个后缀名为pe的文件,跟ST的cubemx作用类似。 双击pe文件即可打开pe界面,生成的文件将…

拓展边界:前端世界的跨域挑战

目录 什么是跨域 概念 同源策略及限制内容 常见跨域场景 如何解决跨域 CORS Nginx代理跨域 Node中间件代理跨域 WebSocket postMessage JSONP 其他 什么是跨域 概念 在此之前,我们了解一下一个域名地址的组成: 跨域指的是在网络安全中&…

2.6日学习打卡----初学RabbitMQ(一)

2.6日学习打卡 初识RabbitMQ、 一. MQ 消息队列 MQ全称Message Queue(消息队列),是在消息的传输过程中保 存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话,你一言我一语。必须及时回复 异步通信相当于通…

数据库管理-第148期 最强Oracle监控EMCC深入使用-05(20240208)

数据库管理148期 2024-02-08 数据库管理-第148期 最强Oracle监控EMCC深入使用-05(20240208)1 性能主页2 ADDM Spotlight3 实时ADDM4 数据库的其他5 主机总结 数据库管理-第148期 最强Oracle监控EMCC深入使用-05(20240208) 作者&am…

【算法】{画决策树 + dfs + 递归 + 回溯 + 剪枝} 解决排列、子集问题(C++)

文章目录 1. 前言2. 算法例题 理解思路、代码46.全排列78.子集 3. 算法题练习1863.找出所有子集的异或总和再求和47.全排列II17.电话号码的字母组合 1. 前言 dfs问题 我们已经学过,对于排列、子集类的问题,一般可以想到暴力枚举,但此类问题用…

【flink状态管理(三)】StateBackend的整体设计、StateBackend创建说明

文章目录 一. 状态后端概述二. StateBackend的整体设计1. 核心功能2. StateBackend的UML3. 小结 三. StateBackend的加载与初始化1. StateBackend创建概述2. StateBackend创建过程 一. 状态后端概述 StateBackend作为状态存储后端,提供了创建和获取KeyedStateBacke…

006集——where语句进行属性筛选——arcgis

在arcgis中, dBASE 文件除了 WHERE 语句以外,不支持 其它 SQL 命令。选择窗口如下: 首先,我们了解下什么是where语句。 WHERE语句是SQL语言中使用频率很高的一种语句。它的作用是从数据库表中选择一些特定的记录行来进行操作。WHE…

Mybatis Day02

增删改查 环境准备 创建一个emp表创建一个新的springboot工程,选择mysql、lombok、mybatis依赖application.properties中引入数据库连接信息创建对应的实体类Emp准备Mapper接口EmpMapper,mapper代表程序运行时自动创建接口的代理对象,并放入…

第8节、双电机多段直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:前面章节主要介绍了bresenham直线插值运动,本节内容介绍让两个电机完成连续的直线运动,目标是画一个正五角星 一、五角星图介绍 五角星总共10条直线,10个顶点。设定左下角为原点…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Blank组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Blank组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Blank组件 空白填充组件,在容器主轴方向上,空白填充组件具…

python-自动化篇-办公-一键将word中的表格提取到excel文件中

文章目录 代码 工作中,经常需要将Word文档中的表格粘贴到Excel文件中,以便汇总及分析。一个一个复制粘贴,非常不方便,还是Python自动化操作,省心省力。要求如下图所示,即将word中的所有表格,转存…

谷歌seo搜索引擎优化有什么思路?

正常做seo哪有那么多思路,其实就那么几种方法,无非就关键词,站内优化,外链,可以说万变不离其宗,但如果交给我们,你就可以实现其他的思路,或者说玩法 收录可以说是一个网站的基础&…

【C语言】三子棋游戏实现代码

目录 1.三子棋代码功能介绍 2.三子棋游戏实现步骤 ①打印菜单栏 ②判断是否进入三子棋游戏 ③三子棋游戏基本函数实现 (1)清空(初始化)棋盘函数实现 (2)打印棋盘函数实现 (3&#xff0…

【JavaScript 漫游】【014】正则表达式通关

文章简介 JS 语言中的 RegExp 对象提供正则表达式的功能。本篇文章旨在对该对象的相关知识点进行总结。内容包括: 正则表达式概述RegExp 对象的实例属性RegExp 对象的实例方法字符串与正则表达式相关的实例方法正则表达式匹配规则 概述 正则表达式的概念 正则表…

Linux 【docker系列1 - docker 安装与使用】

系列文章目录 文章目录 系列文章目录前言一、docker安装二、常用使用1.镜像相关2.读入数据 总结 前言 一、docker安装 docker的官方文档写的非常的详细,它包含了docker在各种环境下的安装,以及可能遇到的问题和解决方案。这里我们只描述docker在contOS上…

PdfFactory Pro软件下载以及序列号注册码生成器

PdfFactory Pro注册机是一款针对同名虚拟打印机软件所推出的用户名和序列号生成器。PdfFactory Pro是一款非常专业的PDF虚拟打印软件,通过使用这款注册机,就能帮助用户免费获取注册码,一键激活,永久免费使用。 pdffactory7注册码如…

利用Python和pandas库进行股票技术分析:移动平均线和MACD指标

利用Python和pandas库进行股票技术分析:移动平均线和MACD指标 介绍准备工作数据准备计算移动平均线计算MACD指标结果展示完整代码演示 介绍 在股票市场中,技术分析是一种常用的方法,它通过对股票价格和交易量等历史数据的分析,来…

【MySQL】学习如何使用DCL进行用户管理

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-JwFD16F1Kh0fle0X {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

机器学习复习(8)——逻辑回归

目录 逻辑函数(Logistic Function) 逻辑回归模型的假设函数 从逻辑回归模型转换到最大似然函数过程 最大似然函数方法 梯度下降 逻辑函数(Logistic Function) 首先,逻辑函数,也称为Sigmoid函数&#…

备战蓝桥杯---搜索(进阶2)

话不多说&#xff0c;直接看题&#xff1a; 相当于找一个点使它到3个国家的距离和min,显然&#xff0c;我们不可以枚举点&#xff0c;但是&#xff0c;我们可以对这3个国家分别bfs&#xff0c;然后枚举相加即可。 下面是AC代码&#xff1a; #include<bits/stdc.h> usin…