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.mfbz.cn/a/796753.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎样在 C 语言中进行类型转换?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

记一次 .NET某上位视觉程序 离奇崩溃分析

一&#xff1a;背景 1. 讲故事 前段时间有位朋友找到我&#xff0c;说他们有一个崩溃的dump让我帮忙看下怎么回事&#xff0c;确实有太多的人在网上找各种故障分析最后联系到了我&#xff0c;还好我一直都是免费分析&#xff0c;不收取任何费用&#xff0c;造福社区。 话不多…

快速读出linux 内核中全局变量

查问题时发现全局变量能读出来会提高效率&#xff0c;于是考虑从怎么读出内核态的全局变量&#xff0c;脚本如下 f open("/proc/kcore", rb) f.seek(4) # skip magic assert f.read(1) b\x02 # 64 位def read_number(bytes):return int.from_bytes(bytes, little,…

每日一练:奇怪的TTL字段(python实现图片操作实战)

打开图片&#xff0c;只有四种数字&#xff1a;127&#xff0c;191&#xff0c;63&#xff0c;255 最大数字为255&#xff0c;想到进制转换 将其均转换为二进制&#xff1a; 发现只有前2位不一样 想着把每个数的前俩位提取出来&#xff0c;组成新的二进制&#xff0c;然后每…

c++ 多边形 xyz 数据 获取 中心点方法,线的中心点取中心值搞定 已解决

有需求需要对。多边形 获取中心点方法&#xff0c;绝大多数都是 puthon和java版本。立体几何学中的知识。 封装函数 point ##########::getCenterOfGravity(std::vector<point> polygon) {if (polygon.size() < 2)return point();auto Area [](point p0, point p1, p…

AI绘画Midijourney操作技巧及变现渠道喂饭式教程!

前言 盘点Midijourney&#xff08;AIGF&#xff09;热门赚米方法&#xff0c;总有一种适合你之AI绘画操作技巧及变现渠道剖析 【表情包制作】 首先我们对表情包制作进行详细的讲解&#xff1a; 当使用 Midjourney&#xff08;AIGF&#xff09; 绘画来制作表情包时&#xff…

ensp防火墙综合实验作业+实验报告

实验目的要求及拓扑图&#xff1a; 我的拓扑&#xff1a; 更改防火墙和交换机&#xff1a; [USG6000V1-GigabitEthernet0/0/0]ip address 192.168.110.5 24 [USG6000V1-GigabitEthernet0/0/0]service-manage all permit [Huawei]vlan batch 10 20 [Huawei]int g0/0/2 [Huawei-…

218.贪心算法:分发糖果(力扣)

核心思想 初始化每个学生的糖果数为1&#xff1a; 确保每个学生至少有一颗糖果。从左到右遍历&#xff1a; 如果当前学生的评分高于前一个学生&#xff0c;则当前学生的糖果数应比前一个学生多一颗。从右到左遍历&#xff1a; 如果当前学生的评分高于后一个学生&#xff0c;则…

排序【选择排序和快速排序】

1.选择排序 1.1基本思想 每次选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在数组的起始位置&#xff0c;直到所有元素都排完。 1.2直接插入排序&#xff1a; 在数组arr[i]到arr[n-1]中选出最大&#xff08;小&#xff09;的元素。若该元素不是数组的…

前端的页面代码

根据老师教的前端页面的知识&#xff0c;加上我也是借鉴了老师上课所说的代码&#xff0c;马马虎虎的写出了页面。如下代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</ti…

小型 FPGA 瞄准 4K 视频接口,MiSTer FPGA 现已支持 Sinden 光枪-FPGA新闻速览

无需矩阵乘法&#xff0c;在 FPGA 上实现低功耗、高性能的 LLM UC Santa Cruz, Soochow University, UC Davis 和 LuxiTech 发表了一篇题为“可扩展的无 MatMul 语言建模”的新技术论文。 “矩阵乘法 (MatMul) 通常占据大型语言模型 (LLM) 总体计算量的主导地位。随着 LLM 扩展…

PLC物联网关在工业自动化领域的应用的意义-天拓四方

随着信息技术的飞速发展&#xff0c;物联网技术正逐步渗透到各个行业领域&#xff0c;其中&#xff0c;工业自动化领域的PLC与物联网的结合&#xff0c;为工业自动化的发展开辟了新的道路。PLC物联网关作为连接PLC与物联网的重要桥梁&#xff0c;其重要性日益凸显。 PLC物联网…

单例模式Singleton

设计模式 23种设计模式 Singleton 所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法。 饿汉式 public class BankTest {public static void main(…

四个“一体化”——构建数智融合时代下的一站式大数据平台

随着智能化技术的飞速发展&#xff0c;尤其是以生成式AI为代表的技术快速应用&#xff0c;推动了数据与智能的深化融合&#xff0c;给数据基础设施带来了新的变革和挑战。如何简化日益复杂的系统架构&#xff0c;提高数据处理效率&#xff0c;降低开发运维成本&#xff0c;促进…

Selenium使用注意事项:

find_element 和 find_elements 的区别 WebDriver和WebElement的区别 问题&#xff1a; 会遇到报错&#xff1a; selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector",&…

STM32智能空气质量监测系统教程

目录 引言环境准备智能空气质量监测系统基础代码实现&#xff1a;实现智能空气质量监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;空气质量监测与优化问题解决方案与优化收尾与总结 1. 引言 智能空…

UCSD和MIT的华人学者最新成果展示:沉浸式远程遥操作机器人

你是否曾想过&#xff0c;自己身处某地&#xff0c;可以控制几千公里以外的「机器人」本体&#xff1f;这个想法&#xff0c;最近被来自UCSD和MIT的华人学者们实现了。UCSD位于加利福尼亚州&#xff0c;MIT位于马萨诸塞州&#xff0c;这两地之差&#xff0c;约3000英里&#xf…

线性回归(梯度下降)

首先说案例&#xff1a; 房子的价格和所占面积有着很大的关系&#xff0c;假如现在有一些关于房子面积和价格的数据&#xff0c;我要如何根据已经有的数据来判断未知的数据呢&#xff1f; 假如x(房屋面积)&#xff0c;y(房屋价格) x[ 56 72 69 88 102 86 76 79 94 74] y[92, …

MySQL 锁分类

MySQL 锁分类 在 MySQL 中&#xff0c;为了保证并发性能和数据安全&#xff0c;有多种锁机制。我们常见的有表级锁和行级锁。让我们一起来学习 MySQL 中各种锁的知识。 表级锁 表级锁是对整张表进行锁定。 表数据锁 1. 读锁 允许多个会话同时读取同一张表的数据&#xff…

大模型时代的目标检测

https://zhuanlan.zhihu.com/p/663703934https://zhuanlan.zhihu.com/p/6637039341.open set/open word/ood 这个任务是指在实际应用上可以检测任何前景物体&#xff0c;但是有些不需要预测类别&#xff0c;只要检测出框就行。在很多场合也有应用场景&#xff0c;有点像类无关…