结构体大揭秘:代码中的时尚之选(上)

目录

  • 结构
  • 结构的声明
  • 结构成员的类型
  • 结构体变量的定义和初始化
  • 结构体成员的访问
  • 结构体传参

结构

结构是一些值的集合,这些值被称为成员变量。之前说过数组是相同类型元素的集合。结构的每个成员可以是不同类型的变量,当然也可以是相同类型的。

我们在生活中会用姓名、性别、年龄、身份证号来描述人,用书名、作者、出版社、书号等等来描述书。像这些复杂的对象就需要用结构体来描述。

结构的声明

struct 名称
{成员列表(一个或者多个);
}变量列表;

比如我们用结构体来描述一个学生,假设需要用到姓名,性别和年龄。

#include<stdio.h>struct Stu
{//成员变量,描述结构体对象的相关属性char name[20];char sex[5];int age;
};int main()
{//int a;struct Stu a; //struct Stu是类型return 0;
}

在这里插入图片描述

struct Stu
{//成员变量,描述结构体对象的相关属性char name[20];char sex[5];int age;
}a,b,c; //这里的a,b,c是结构体变量,属于全局变量
typedef struct Stu
{//成员变量,描述结构体对象的相关属性char name[20];char sex[5];int age;
}Stu; //这里的Stu相当于把struct Stu重命名为Stu int main()
{//struct Stu a;Stu a; //struct Stu是类型。现在由Stu替代。没有typedef,struct不能省略。return 0;
}

结构成员的类型

结构成员可以是标量、数组、指针或者其他结构体。

struct A 
{int a; char arr[10]; //数组int* p; //指针
};struct B
{int b;struct A b; //其他结构体
};

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

//定义
//第一种方法
struct A
{int x;int y;
}a1; //定义a1//第二种方法
struct A a2; //定义结构体变量a2
//初始化1
struct A a3 = {3,5};//定义变量的同时初始化。
//初始化2
struct A
{int x;int y;
}a4 = {3,5};

结构体成员的访问

通过点操作符访问

//1
#include<stdio.h>struct A
{int x;int y;
}a4 = {3,5};int main()
{printf("%d %d\n", a4.x, a4.y);return 0;
}
//2
#include<stdio.h>struct Stu
{char name[10];char sex[5];int age;
};int main()
{struct Stu a = { "小刘","男",19};printf("%s %s %d\n", a.name, a.sex, a.age);return 0;
}

有时候我们得到的不是结构体变量,而是一个指向结构体的指针

#include<stdio.h>
struct Stu
{char name[10];char sex[5];int age;
};void Out(struct Stu* pa)
{printf("%s %s %d\n", (*pa).name, (*pa).sex, (*pa).age);printf("%s %s %d\n", pa->name, pa->sex, pa->age);//使用结构体指针访问指向对象的成员
}
int main()
{struct Stu a = { "小刘", "男", 19 };Out(&a);return 0;
}

结构体传参

#include<stdio.h>struct A
{int arr[100];int num;
}a = { {1,2,3} , 5};//结构体传参
void Out1(struct A a)
{printf("%d\n", a.num);
}//结构体地址传参
void Out2(struct A* pa)
{printf("%d\n", pa->num);
}int main()
{Out1(a); //方法1Out2(&a); //方法2return 0;
}

首选方法2
原因:函数传参的时候,参数是需要压栈的。如果传递的结构体对象的时候,结构体太大的话,参数压栈的系统开销会比较大,很浪费内存,会导致性能下降。
所以结构体传参的时候,要传结构体的地址

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

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

相关文章

【系统调用IO】open、close、read、write、lseek

目录 3 系统调用IO3.1 文件描述符3.1.1 FILE结构体3.2.2 文件描述符 3.3 open、close、read、write、lseek3.3.1 文件权限3.3.2 open3.3.3 close3.3.4 read3.3.5 write3.3.6 lseek3.3.7 代码示例 文件io和标准io的区别 橙色 3 系统调用IO 3.1 文件描述符 3.1.1 FILE结构体 …

多线程编程1

一、线程的引入 上节&#xff0c;我们介绍了进程的概念&#xff0c;以及操作系统内核是如何管理进程的&#xff08;描述组织&#xff09;&#xff0c;PCB中的核心属性有哪些&#xff0c; 引入进程这个概念&#xff0c;最主要的目的&#xff0c;就是为了解决“并发编程”这样的…

JavaScript语法摘要

JavaScript语法摘要 JavaScript语法通过各种规则和组合&#xff0c;就能创建出丰富多彩的程序呢&#xff01;它包括了怎么声明和使用变量、如何定义和赋值&#xff0c;还有怎么用运算符和表达式等等。另外&#xff0c;我还发现了一些有趣的概念&#xff0c;比如关键字、注释、…

探索Flask中的RESTful API设计与实现

Restful API 基础介绍&#xff1a; ​ RESTful API&#xff08;Representational State Transfer&#xff09;是一种基于HTTP协议设计的应用程序编程接口&#xff08;API&#xff09;风格&#xff0c;用于在客户端和服务器之间进行通信。它提供了一组规范和约束&#xff0c;用…

Python学习从0到1 day7 Python判断语句

路远殊途&#xff0c;祝你得偿所愿 ——24.1.21 前言 进行逻辑判断&#xff0c;是生活中常见的行为&#xff0c;同样&#xff0c;在程序中&#xff0c;进行逻辑判断也是最为基础的功能 一、布尔类型和比较运算符 1.布尔类型 进行判断&#xff0c;有两个结果&#xff0c;True、…

C 练习实例37 - 排序

题目&#xff1a;对10个数进行排序。 从小到大排序题目分析&#xff1a; 1 6 3 4 8 9 0 2 5 7&#xff08;假设10个数据&#xff09; 第一个和第二个比&#xff0c;把大的那个数放在右边 第二个和第三个比&#xff0c;把大的那个数放在右边 以此类推...... 从而把最大的那…

springboot集成COS对象存储

1.申请腾讯云存储桶 新建密钥&#xff08;后面配置要用到&#xff09; 2.编写工具类 此处使用工具类进行基本属性配置&#xff0c;也可选择在yml中配置 package com.sfy.util;import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.a…

基于xgboost-LGBM-SVM的病人哮喘病识别检测 数据+代码

基于xgboost-LGBM-SVM的病人哮喘病识别检测-完整代码可直接运行_哔哩哔哩_bilibili 代码: from sklearn import preprocessing import random from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler from sklearn import pr…

声明式注解对XXL-JOB的定时任务代码生效吗?

说明&#xff1a;源于博主的思考&#xff0c;本文验证一下声明式注解&#xff0c;即Transactional注解&#xff0c;对XXL-JOB的定时任务是否生效。 准备 首先&#xff0c;创建一个需要事务的场景。有两张表&#xff0c;一张部门表&#xff0c;一张用户表&#xff0c;用户隶属…

字符串经典基础面试题(算法村第十二关白银挑战)

反转问题 反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须**原地修改输入数组**、使用 O(1) 的额外…

基于YOLOv8的目标识别、计数、电子围栏的项目开发过程

0 前言 用于生产环境中物体检测、识别、跟踪&#xff0c;人、车流量统计&#xff0c;越界安全识别 1 YOLOv8概述 YOLOv8 是Ultralytics的YOLO的最新版本。作为一种前沿、最先进(SOTA)的模型&#xff0c;YOLOv8在之前版本的成功基础上引入了新功能和改进&#xff0c;以提高性…

cupy,一个超级实用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超级实用的 Python 库 - cupy。 Github地址&#xff1a;https://github.com/cupy/cupy 深度学习和科学计算需要处理大规模的数据和复杂的计算任务&#xff0c;而Python是一…

spring boot 常用的 Cron 表达式

在使用定时调度任务的时候&#xff0c;我们最常用的&#xff0c;就是cron表达式了。通过cron表达式来指定任务在某个时间点或者周期性的执行。cron表达式配置起来简洁方便&#xff0c;无论是Spring的Scheduled还是用Quartz框架&#xff0c;都支持cron表达式。 cron表达式含义常…

C语言易忘操作符全集

位操作符 1.按位与(&) 这个操作符对两个整数的每一位进行比较&#xff0c;如果两个相应的位都为1&#xff0c;则结果为1&#xff0c;否则为0。 int a 60; // 60 0010 1100 in binary int b 13; // 13 0000 1101 in binary int c a & b; // c 0000 110…

tag 标签

tag 标签 在使用 Git 版本控制的过程中&#xff0c;会产生大量的版本。如果我们想对某些重要版本进行记录&#xff0c;就可以给仓库历史中的某一个commit 打上标签&#xff0c;用于标识。 在本章中&#xff0c;我们将会学习如何列出已有的标签、如何创建和删除新的标签、以及…

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息 2024/1/16 17:55 百度&#xff1a;RK3399 ALC5640 RK3399 RT5640 BING&#xff1a;RK3399 ALC5640 LINE-IN接麦克风不会有声音的。 耳机只有右边有声音&#xff0c;但是偏小&#xff0c;可以通过音量…

计算机安全学习笔记(VI):9道关于网络安全的练习题

1.哪个 UDP 字段用于检测数据报损坏&#xff1f; a. 总长度b. 目的端口c. 校验和d. 源端口 正确答案是&#xff1a; c. 校验和(Checksum) 在UDP&#xff08;用户数据报协议&#xff09;中&#xff0c;校验和&#xff08;Checksum&#xff09;字段用于检测数据报文的完整性。…

C++ memmove 学习

memmove&#xff0c;将num字节的值从源指向的位置复制到目标指向的内存块。 允许目标和源有重叠。 当目标区域与源区域没有重叠则和memcpy函数功能相同。 宽字符版本是wmemmove&#xff0c;安全版本加_s&#xff1b; #include "stdafx.h" #include<iostream&g…

如何为不同品牌的笔记本电脑设置充电限制,这里提供详细步骤

笔记本电脑的电池健康状况至关重要。延长电池寿命可以帮你省下不少钱。对于长时间充电的Windows 11笔记本电脑用户来说,将电池电量限制在80%是很重要的。 虽然操作系统没有提供设置自定义电池充电限制的内置方法,但仍有一些方法可以在Windows 11中配置电池设置,并将其限制在…

华南理工大学数字信号处理实验实验一(薛y老师版本)matlab源码

一、实验目的 1、加深对离散信号频谱分析的理解&#xff1b; 2、分析不同加窗长度对信号频谱的影响&#xff1b; 3、理解频率分辨率的概念&#xff0c;并分析其对频谱的 影响&#xff1b; 4、窗长和补零对DFT的影响 实验源码&#xff1a; 第一题&#xff1a; % 定义离散信…