C 语言结构体

由于近期项目需求,需使用到大量的指针与结构体,为更好的完成项目,故对结构体与指针的内容进行回顾,同时撰写本博客,方便后续查阅。

本博客涉及的结构体知识有:

1.0:结构体的创建和使用

2.0:  typedef 关键字与#define 关键字的区别

3.0:  结构体成员的访问【地址访问与成员访问】

4.0: 结构体嵌套调用

......


1.0:结构体的创建和使用

结构体类型和枚举类型一样,是一种用户自定义的数据类型,它可以使用一个变量来描述事物的多种属性,便于数据的管理,数据类型声明的语法格式:

// 结构体的声明格式
typedef struct
{成员列表
}structName_t;注:成员列表中的成员并不是变量在什么的时候并不会开辟内存空间内存空间的开辟要在创建结构体变量之后************************************  结构体: 创建结构体案例*  参数  : 结构体成员 char name[20]; char tel[12];*  返回值: 无*  时间  : 2024/7/13 *  作者  : _沧浪之水_************************************ 
**/
typedef struct
{char name[20];char tel[12];char sex[5];int high;
}People_t;

结构体变量的定义

/**************************************  结构体: 结构体变量定义后同时进行赋值*  参数  : 无参数*  返回值: 无返回值*  时间  : 2024/7/13 *  作者  : _沧浪之水_************************************
**/
People_t peo = { "张三","15863310892","男",181 };

2.0 typedef 关键字的使用

typedef关键关键字:用于定义一个已有关键字的别名,具体创建格式如下所示

/**************************************  结构体: typedef 关键字的用法*  参数  : 无参数*  返回值: 无返回值*  时间  : 2024/7/13 *  作者  : _沧浪之水_************************************
**/
typedef 数据类 名字typedef uint8_t uint;typedef unsigned char uchar;

typedef 关键字和define关键字的区别,两者都是给对象取一个别名增强程序的可读性【尽量防止程序中魔鬼数字的出现】,两者有如下的区别

1: 使用场景不同

typedef 关键字用于给数据类型定义别名

#define关键字又称为(宏定义) 用于给数字,表达式(写表达式时注意带上括号防止异常问题的出现),代码语句定义别名。

2:执行时机不同

typedef在编译阶段执行;

#define在预编译阶段执行;

3:定义方法不同

#define别名在替换对象的前面,并且定义后面不用加分号;

#define PI 3.14#define MAX_NUM_LIST 9

typedef的别名在替换对象的后面,并且定义后面需要加分号;

typedef unsigned char uchar;

3.0:  结构体成员的访问

注:有指针访问和圆点运算符访问两种访问方式

使用圆点运算符并打印输出

    /**************************************  结构体: 结构体成员变量访问*  参数  : 结构体成员访问*  返回值: 无*  时间  : 2024/7/13 *  作者  : _沧浪之水_**************************************/// peo 是结构体变量,结构体变量创建后才会开辟内存控制,结构体变量初始化People_t peo = { "张三","15863310892","男",181 };// 浮点数在内存中不能精确的存储,结构体嵌套初始化recallStruct_t recal = { {"李四","15863310892","男",181},100, 88.8f };printf("%s %s %s %d\n", peo.name, peo.tel, peo.sex, peo.high);printf("%s %s %s %d %d %f\n", recal.p.name,recal.p.tel,recal.p.sex, recal.p.high,recal.num,recal.f);

使用指针访问【地址访问】

/**************************************  结构体: 结构体传递地址调用*  参数  : *p 指针地址*  返回值: 无*  时间  : 2024/7/13 *  作者  : _沧浪之水_************************************
**/
void Print(People_t  *p) 
{// 左边的是结构体指针 “结构体指针->成员变量”printf("%s %s %s %d\n", p->name, p->tel, p->sex, p->high);
}

注:以上的这种写法需要在主函数中进行调用


4.0: 结构体嵌套调用

#define  _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include <string.h>
#include "add.h"
#include <stdint.h>/**************************************  结构体: 创建结构体*  参数  : 结构体成员 char name[20]; char tel[12];*  返回值: 无*  时间  : 2024/7/13*  作者  : _沧浪之水_************************************ 
**/
typedef struct
{char name[20];char tel[12];char sex[5];int high;
}People_t;/**************************************  结构体: 创建结构体*  参数  : 结构体成员,内部包含结构体【顺带变量初始化,结构体初始化】*  返回值: 无*  时间  : 2024/7/13*  作者  : _沧浪之水_************************************
**/
typedef struct 
{People_t p;int num;float f;
}recallStruct_t;/**************************************  结构体: 结构体传递地址调用*  参数  : *p 指针地址*  返回值: 无*  时间  : 2024/7/13*  作者  : _沧浪之水_************************************
**/
void Print(People_t  *p) 
{// 左边的是结构体指针 “结构体指针->成员变量”printf("%s %s %s %d\n", p->name, p->tel, p->sex, p->high);
}/**************************************  结构体: 结构体成员变量访问*  参数  : 结构体成员访问*  返回值: 无*  时间  : 2024/7/13*  作者  : _沧浪之水_************************************
**/
void PrintTwo(People_t input) 
{// 左边的是结构体变量 “结构体变量.成员变量”printf("%s %s %s %d\n", input.name, input.tel, input.sex, input.high);
}int main()
{// peo 是结构体变量,结构体变量创建后才会开辟内存控制,结构体变量初始化People_t peo = { "张三","15863310892","男",181 };// 浮点数在内存中不能精确的存储,结构体嵌套初始化recallStruct_t recal = { {"李四","15863310892","男",181},100, 88.8f };printf("%s %s %s %d\n", peo.name, peo.tel, peo.sex, peo.high);printf("%s %s %s %d %d %f\n", recal.p.name, recal.p.tel, recal.p.sex, recal.p.high, recal.num, recal.f);Print(&peo);PrintTwo(peo);return 0;
}

注:以上的注释编写方式仅限于更好的理解知识,实际的开发过程会更为规范,推荐书籍《高质量 C C++ 编程指南 》。

 注:上面的两种打印输出方式哪一种打印方式更好,结构体传递参数吧 “对象” 进行结构体传参的时PrintTwo() 这种参数传递方式方式时PrintTwo(peo),peo实际是一个对象已经在内存中开辟了一块内存空间,如果把对象作为实际参数传递给形参的时候“形参里面的内容实际上是实际参数的一份拷贝” 打印peo的时候打印输出的数据是一样的,空间和时间的浪费会降低程序的性能。【推荐使用地址传递的方式把参数的地址传递进去(地址的大小就是4-8字节)通过地址找到数据】参数传递的时候会压栈结构体传递参数的时候尽量传递结构体的地址节省时间和空间


5.0 数组方式给结构体成员赋值

#define  _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include <string.h>
#include "add.h"
#include <stdint.h>#define MAX_LIST_NUM (sizeof(arrList) / sizeof(arrList[0]))/**************************************  结构体: 创建结构体*  参数  : 结构体成员 char name[20]; char tel[12];*  返回值: 无*  时间  : 2024/7/13*  作者  : _沧浪之水_************************************ 
**/
typedef struct
{char name[20];char tel[12];char sex[5];int high;
}People_t;static People_t arrList[] =
{{"Keil","122345625","男",180},{"Ling","122345625","女",185}
};int main()
{uint8_t i = 0;for (i = 0; i < MAX_LIST_NUM; i++) {printf("%s %s %s %d\n", arrList[i].name, arrList[i].tel, arrList[i].sex, arrList[i].high);}return 0;
}


 ......

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

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

相关文章

解锁音乐密码,人工智能创作动人歌词

在音乐的神秘世界里&#xff0c;每一段旋律都像是一把等待开启的密码锁&#xff0c;隐藏着无尽的情感与故事。而如今&#xff0c;人工智能正以其独特的智慧和创造力&#xff0c;帮助我们解锁这些音乐密码&#xff0c;创作出动人的歌词。 “妙笔生词智能写歌词软件&#xff08;…

Provider(1)- 什么是AudioBufferProvider

什么是AudioBufferProvider&#xff1f; 顾名思义&#xff0c;Audio音频数据缓冲提供&#xff0c;就是提供音频数据的缓冲类&#xff0c;而且这个AudioBufferProvider派生出许多子类&#xff0c;每个子类有不同的用途&#xff0c;至关重要&#xff1b;那它在Android哪个地方使…

访问 Postman OAuth 2.0 授权的最佳实践

OAuth 2.0 代表了 web 安全协议的发展&#xff0c;便于在多个平台上进行授权服务&#xff0c;同时避免暴露用户凭据。它提供了一种安全的方式&#xff0c;让用户可以授权应用程序访问服务。 在 Postman 中开始使用 OAuth 2.0 Postman 是一个流行的API客户端&#xff0c;支持 …

探索4D毫米波雷达和摄像头在自动驾驶中的潜力

随着自动驾驶技术的快速发展&#xff0c;关于各种传感器的必要性&#xff0c;尤其是LiDAR&#xff08;激光雷达&#xff09;与毫米波雷达结合摄像头的作用&#xff0c;激发了激烈的讨论。在这篇博客中&#xff0c;我们将探讨4D毫米波雷达和摄像头的组合是否可能成为自动驾驶车辆…

将vue项目整合到springboot项目中并在阿里云上运行

第一步&#xff0c;使用springboot中的thymeleaf模板引擎 导入依赖 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> 在r…

聊聊接入Arbitrum的正确姿势

本文首发于公众号&#xff1a;Keegan小钢 前言 我们知道&#xff0c;目前最主流的 Ethereum Layer2 方案中&#xff0c;主要有 Optimistic Rollup 和 ZK Rollup 两大类。而 Optimistic Rollup 的实现方案中&#xff0c;则是 Optimism 和 Arbitrum 最受关注。而我们最近接入了 …

Java套红:指定位置合并文档-NiceXWPFDocument

需求&#xff1a;做个公文系统&#xff0c;需要将正文文档在某个节点点击套红按钮&#xff0c;实现文档套红 试了很多方法&#xff0c;大多数网上能查到但是实际代码不能找到关键方法&#xff0c;可能是跟包的版本有关系&#xff0c;下面记录能用的这个。 一&#xff1a;添加依…

redis-cli 连接Redis

Redis-cli介绍 redis-cli 是原生 Redis 自带的命令行工具&#xff0c;您可以在云主机或本地设备上通过 redis-cli 连接 Redis 数据库&#xff0c;进行数据管理。 redis-cli 客户端的使用方法&#xff0c;请参考官方文档。 连接命令 redis-cli -h <redis_instance_address…

一个极简的 Vue 示例

https://andi.cn/page/621516.html

【qt】客户端连接到服务器

获取到IP地址和端口号. 通过connectToHost() 来进行连接. 对于客户端来讲,只需要socket即可. 客户端连接服务端只需要使用套接字(Socket)来进行通信。客户端通过创建一个套接字来连接服务端&#xff0c;然后可以通过套接字发送和接收数据。套接字提供了一种简单而灵活的方式来…

接口安全配置

问题点&#xff1a; 有员工在工位在某个接口下链接一个集线器&#xff0c;从而扩展上网接口&#xff0c;这种行为在某些公司是被禁止的&#xff0c;那么网络管理员如何控制呢&#xff1f;可以配置接口安全来限制链接的数量&#xff0c;切被加入安全的mac地址不会老化&#xff…

JS实现:统计字符出现频率/计算文字在文本中的出现次数

要实现这个功能&#xff0c;JavaScript 一个非常强大的方法&#xff0c;那就是reduce() reduce() 它用于将数组的所有元素减少到一个单一的值。这个值可以是任何类型&#xff0c;包括但不限于数字、字符串、对象或数组。 reduce() 方法接收一个回调函数作为参数&#xff0c;这个…

win10 docker-compose搭建ELK日志收集

elk的威名大家都知道&#xff0c;以前前司有专门的人维护&#xff0c;现在换了环境&#xff0c;实在不想上服务器看&#xff0c;所以就摸索下自己搭建&#xff0c;由于现场服务器是需要类似向日葵那样连接&#xff0c;我还是把日志弄回来&#xff0c;自己本地filebeat上传到es中…

ESP32和ESP8266的WIFI的136个问题与答案

ESP32和ESP8266的WIFI的136个问题与答案 ESP32和ESP8266 WIFI相关问题与答案&#xff0c;具有一定的参考价值。ESP32-S3模块 1. ESP32 和 ESP8266 是否支持中文 SSID&#xff1f; ESP32 和 ESP8266 均支持中文 SSID&#xff0c;但需要使用相应的库和设置。需要注意的是&#…

自定义函数---随机数系列函数

大家有没有发现平常在写随机数的时候&#xff0c;需要引入很多的头文件&#xff0c;然后还需要用一些复杂的函数&#xff0c;大家可能不太习惯&#xff0c;于是我就制作了一个头文件 // random_number.h #ifndef RANDOM_NUMBER_H // 预处理指令&#xff0c;防止头文件被重复包含…

六款领先的电脑监控软件系统(哪些电脑软件可以监控电脑)

在当今信息时代&#xff0c;企业对数据安全和员工生产力的关注度越来越高。电脑监控软件系统成为企业管理的重要工具&#xff0c;帮助企业确保信息安全、提高工作效率。本文将介绍几款领先的电脑监控软件系统&#xff0c;以便企业选择最适合的解决方案。固信电脑监控软件 可免费…

log4j2的日志框架(详细,springboot和异步日志的实现)

目录 log4j2的介绍 Log4j2的性能 SpringBoot中的使用Log4j2 log4j2的进阶--异步日志 AsyncAppender方式 AsyncLogger方式 log4j2的介绍 Apache Log4j 2是对Log4j的升级版&#xff0c;参考了logback的一些优秀的设计&#xff0c;并且修复了一些问题&#xff0c;因此带 来…

Go-知识测试-测试参数

Go-知识测试-测试参数 1. -args2. -json3. -o4. -bench5. -benchtime6. -cpu7. -count8. -failfast9. -list10. -parallel11. -run12. -timeout13. -v14 -benchmem 1. -args 指示go test 把-args 后面的参数带到测试中去。具体的测试函数会根据此参数来控制测试流程。 -args后…

主机安全-进程、命令攻击与检测

目录 概述反弹shell原理nc/dev/xxx反弹shell下载不落地反弹Shell各种语言反弹shell linux提权sudosuid提权mysql提权 Dnslog参考 概述 本文更新通过在主机&#xff08;不含容器&#xff09;上直接执行命令或启动进程来攻击的场景。检测方面以字节跳动的开源HIDS elkeid举例。每…

磁感应强度检测模块使用教程

目录 一、磁感应强度检测模块(AT 协议版本、Modbus 协议版本)1、参数2、报警引脚 二、AT版本1、接线说明2、AT 指令 三、Modbus 版本1、接线说明2、Modbus 指令格式3、Modbus 指令 一、磁感应强度检测模块(AT 协议版本、Modbus 协议版本) 图1 正面 图2 背面 AT 协议版本和 Modb…