【c语言】结构体详解 | 结构体数组/指针

news2024/12/23 15:41:11

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c语言系列专栏:c语言之路重点知识整合 🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ


结构体 目录

  • 一、结构体的定义
  • 二、. 操作符
  • 三、结构体数组
  • 四、结构体指针
    • 创建结构体指针:
    • 不同定义结构体指针的方法:
    • 不同方法使用指针操作结构体成员:

一、结构体的定义

结构体就是对数据类型的扩展,在一个结构体中可以存放多个类型的数据。

之前的枚举类型也是对数据类型的扩展,在定义结构体之前,可以先回忆一下枚举类型enum枚举类型的定义格式 | 基本用法

我们是这样创建枚举类型的:

enum card_type 
{
	身份证,学生证,银行卡
}

然后可以使用typedef简化: (typedef知识点:typedef的基本用法)

typedef enum card_type CARD_TYPE;
	//简化后的用法
	CARD_TYPE a = 学生证;

有了枚举类型的经验,我们就可以继续创建结构体:

它是一种把现有的数据类型,根据表格里面数据的类型组织成一个类型的组合体

在这里插入图片描述
结构体想表达的就是类似表格的一种数据结构

结构体的定义格式:

struct 结构体名
{
	类型 成员变量1;
	类型 成员变量2;
	....
};

定义一个学生信息结构体:

#define 'M'	//定义宏:M代表男,W代表女
#define 'W'
typedef enum card_type {身份证,学生证,JSZ} CARD_TYPE; //使用枚举简化证件类型
struct stu_info
	{
		unsigned int stuNum;//学号
		CARD_TYPE cardType;//证件类型
		char cardNum[20];//证件号码
		char name[20];//姓名
		char sex;//性别
	};

赋初值:

	struct stu_info s1={1,身份证,"123","天喜",M};

通过调试器查看:s1中存放了不同变量类型的值

在这里插入图片描述

二、. 操作符

我们已经定义了一个结构体类型s1,如何对结构体中某个单个的数据进行改变呢?又如何输出s1中的数据?

存取结构体成员值 用.操作符

struct stu_info s2;
	s2.stuNum = 2;
	s2.cardType = 身份证;
	//s1.cardNum = "654";
	//通过strcpy复制: 
	strcpy(s1.cardNum, "123456");
	strcpy(s1.name, "张三");
	s1.sex =;

scanf输入数据:

	struct stu_info s3;
	scanf("%d%d%s%s%c", &s3.stuNum,
		&s3.cardType,
		s3.cardNum,
		s3.name,
		&s3.sex
		);

通过printf打印时,一定要注意 输入单个字符前加个空格 因为%c也读取空格这个字符,否则就会出现下面M未被存入的情况

在这里插入图片描述
正确的依次输入输出:

	struct stu_info s3;
	scanf("%d%d%s%s %c", &s3.stuNum,
		&s3.cardType,
		s3.cardNum,
		s3.name,
		&s3.sex
		);
	//输入单个字符前加个空格 因为%c也读取空格这个字符
	printf("%d %d %s %s %c", s3.stuNum,
		s3.cardType,
		s3.cardNum,
		s3.name,
		s3.sex
	);

在这里插入图片描述

结构体基本概念的全部代码(供自己调试查看):

#include <stdio.h>
#include <stdlib.h>
#define 'M'
#define 'W'

int main()
{
	/*定义一个结构体*/
	typedef enum card_type {身份证,学生证,JSZ} CARD_TYPE;
	/*创建结构体变量并赋初值*/
	struct stu_info
	{
		unsigned int stuNum;//学号
		CARD_TYPE cardType;//证件类型
		char cardNum[20];//证件号码
		char name[20];//姓名
		char sex;//性别

	}	;
	struct stu_info s1={1,身份证,"123","天喜",};
	/*存取结构体成员值 用.操作符*/
	struct stu_info s2;
	s2.stuNum = 2;
	s2.cardType = 身份证;
	//s1.cardNum = "654";
	strcpy(s1.cardNum, "123456");
	strcpy(s1.name, "张三");
	s1.sex =;

	struct stu_info s3;
	scanf("%d%d%s%s %c", &s3.stuNum,
		&s3.cardType,
		s3.cardNum,
		s3.name,
		&s3.sex
		);
	//输入单个字符前加个空格 因为%c也读取空格这个字符
	printf("%d %d %s %s %c", s3.stuNum,
		s3.cardType,
		s3.cardNum,
		s3.name,
		s3.sex
	);
	return 0;
}

三、结构体数组

首先定义一个book结构体

/*定义一个结构体*/
typedef struct book
{
	int year;//年份
	double prince;//价格
	char bookName[50];//书名
	char author[20];//作者
} BOOK;

使用结构体类型名定义数组即为结构体数组

	BOOK  books[] = { 
		{1992,23.5,"活着","余华"},
		{2008,59.0,"三体","刘慈欣"},
		{1992,48.8,"白鹿原","陈忠实"},
		{1989,38.0,"我与地坛","史铁生"}
	};

调试器查看: 存在了栈区中的结构体数组

在这里插入图片描述

同样通过 . 操作运算符进行遍历、输出

在这里插入图片描述

结构体数组全部代码(供自己调试查看):

#include <stdio.h>
#include <stdlib.h>
/*定义一个结构体*/
typedef struct book
{
	int year;//年份
	double prince;//价格
	char bookName[50];//书名
	char author[20];//作者
} BOOK;
int main()
{
	
	/*创建结构体数组变量*/
	BOOK  books[] = { 
		{1992,23.5,"活着","余华"},
		{2008,59.0,"三体","刘慈欣"},
		{1992,48.8,"白鹿原","陈忠实"},
		{1989,38.0,"我与地坛","史铁生"}
	};

	//按年份排序
	for (int i = 0; i < 4 - 1; i++)
	{
		for (int j = i + 1; j < 4; j++)
		{
			if (books[i].year > books[j].year
				|| books[i].year == books[j].year&& books[i].prince < books[j].prince)
			{
				BOOK t; t = books[i]; books[i] = books[j]; books[j] = t;
			}
		}
	}

	for (int i = 0; i < 4; i++)
	{
		printf("%-6d%6.2f %-20s%-20s\n", books[i].year, books[i].prince, books[i].bookName, books[i].author);
	}

	return 0;
}

四、结构体指针

创建结构体指针:

直接在结构体后面定义指针变量:

#include <stdio.h>
/*定义一个结构体*/
typedef struct book
{
	int year;//年份
	double prince;//价格
	char bookName[50];//书名
	char author[20];//作者
} BOOK, *P_BOOK;

/*创建结构体指针变量*/
	//指针模型
	int a = 3;//直接访问空间
	int* p = &a;

	//间接访问空间

	*p = 5;
	BOOK  books[] = {
		{1992,23.5,"活着","余华"},
		{2008,59.0,"三体","刘慈欣"},
		{1992,48.8,"白鹿原","陈忠实"},
		{1989,38.0,"我与地坛","史铁生"}
	};

不同定义结构体指针的方法:

	struct book* p1=&books[0];
	BOOK* p2 = books;
	P_BOOK p3 = &books[3];

不同方法使用指针操作结构体成员:

方式一: (*指针).成员

先*取得整体空间,再通过 . 取得成员空间

	printf("%s\n", (*p1).bookName);

方式二: 指针 -> 成员

用指针指向某结构体内的成员

	printf("%s\n", p1->bookName);

结构体指针全部代码(供自己调试查看):

#include <stdio.h>
/*定义一个结构体*/
typedef struct book
{
	int year;//年份
	double prince;//价格
	char bookName[50];//书名
	char author[20];//作者
} BOOK, *P_BOOK;	
//typedef BOOK* P_BOOK;
int main()
{
	
	/*创建结构体指针变量*/
	//指针模型
	int a = 3;//直接访问空间
	int* p = &a;
	//间接访问空间
	*p = 5;
	
	BOOK  books[] = {
		{1992,23.5,"活着","余华"},
		{2008,59.0,"三体","刘慈欣"},
		{1992,48.8,"白鹿原","陈忠实"},
		{1989,38.0,"我与地坛","史铁生"}
	};

	//不同定义结构体指针的方法:
	struct book* p1=&books[0];
	BOOK* p2 = books;
	P_BOOK p3 = &books[3];

	/*使用指针操作结构体成员 
	 方式一:  (*指针).成员
	 方式二:  指针 -> 成员
	 */
	printf("%s\n", (*p1).bookName);
	printf("%s\n", p1->bookName);
	
	return 0;
}

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。

在这里插入图片描述

大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

【ChirpStack 】如何获取 JWT TOKEN

LoRa App Server 提供了两类 API 接口&#xff0c;其中 RESTful JSON API 提供了一个 API console&#xff0c;在AS地址的基础上使用 /api 即可访问&#xff0c;罗列了 API 端点和文档介绍&#xff0c;测试起来非常方便。 本文主要介绍 如何使用 chirpstack 的API 进行测试以及…

商户查询的缓存——基于逻辑过期方式解决缓存击穿问题

//基于逻辑过期方式解决缓存基穿问题 理论上讲都是可以命中的 public Shop queryWithLogincalExpire(Long id){ //1.从redis中查商铺缓存 String jsonShop stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY id); //2.未命中 if(StringUtils.isBlank(j…

Python程序运行中报Memoryerror的解决方案

在求解某高维时间依赖的PDE中&#xff0c;空间计算域在每一个空间方向均为M256&#xff0c;且快速算法被执行以解决储存与计算速度问题&#xff1b;而时间方向取T2000&#xff0c;时间步长0.01。 在Spyder提前运行过&#xff0c;第一次假如迭代了1468次&#xff0c;即会报Memo…

本地部署 Dolly V2

本地部署 Dolly V2 1. 什么是 Dolly V22. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 部署 Dolly V26. 编写测试程序7. 运行测试程序 1. 什么是 Dolly V2 Databricks的dolly-v2-12b&#xff0c;是一个在 Databricks 机器学习平台上训练的指令跟随型大型语言模型&#xf…

计算机图形学 | 实验七:完成摄像机类的创建

计算机图形学 | 实验七&#xff1a;完成摄像机类的创建 计算机图形学 | 实验七&#xff1a;完成摄像机类的创建摄像机/观察空间Look At 矩阵自由移动视角移动鼠标输入缩放 华中科技大学《计算机图形学》课程 MOOC地址&#xff1a;计算机图形学&#xff08;HUST&#xff09; 计…

【自然语言处理】自然语言处理 --- NLP入门指南

文章目录 一、什么是NLP二、NLP任务类型三、NLP的预处理英文 NLP 语料预处理的 6 个步骤中文 NLP 语料预处理的 4 个步骤第1步&#xff1a;收集您的数据---语料库第2步&#xff1a;清理数据 --- 文本清洗第3步&#xff1a;分词第4步&#xff1a;标准化第5步&#xff1a;特征提取…

花式玩转二叉树层序遍历——实现二叉树Z字输出

文章目录 题目介绍二叉树层序遍历——队列实现Java完整代码 分析Java完整代码实现总结 题目介绍 这个题目是在做一个测试里面遇到的&#xff0c;大致描述如下&#xff1a; 现在有一棵二叉树&#xff0c;需要实现如图所示的交叉来回遍历&#xff1a; 即相较于普通的层序遍历&a…

基于目标级联法的微网群多主体分布式优化调度(已更新)

目录 一、主要内容 1.1 上层微网群模型 1.2 下层微网模型 二、部分程序 三、实现效果 四、下载链接 一、主要内容 本文复现《基于目标级联法的微网群多主体分布式优化调度》文献的目标级联部分&#xff0c; 建立微网群系统的两级递阶优化调度模型: 上层是微网群能量调度中…

Jvm --java虚拟机(下)

目录 执行引擎 什么是执行引擎&#xff1f; 什么是解释器&#xff1f;什么是 JIT 编译器&#xff1f; 为什么 Java 是半编译半解释型语言&#xff1f; JIT 编译器执行效率高为什么还需要解释器&#xff1f; 垃圾回收 垃圾回收概述 什么是垃圾&#xff1f; 为什么需要GC&a…

Redis持久化--RDB

一. RDB是什么 在指定的时间间隔内将内存中的数据集快照写入磁盘&#xff0c; 也就 Snapshot 快照&#xff0c;恢复时将快照文件读到内存二. RDB持久化的流程 解读&#xff1a; redis 客户端执行 bgsave 命令或者自动触发 bgsave 命令&#xff1b;主进程判断当前是否已经存在…

【开源之夏 2023】欢迎报名 SOFAStack 社区项目!

开源之夏是由“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&#xff0c;促进优秀开源软件社区的蓬勃发展&#xff0c;培养和发掘更多优秀的开发者。 活动联合国内外各大开源社区&#xff0c;针对重要开…

荔枝派Zero(全志V3S)驱动开发之RGB LCD屏幕显示bmp图片

文章目录 前言一、如何在 linux 下驱动 LCD1、什么是 Framebuffer 设备2、如何确保 Framebuffer 设备已存在3、Frame_buffer 设备结构体<1>、fb_info 详解<2>、struct fb_fix_screeninfo 详解<3>、struct fb_var_screeninfo 详解 4、设备树中有关 framebuffe…

使用 Appium 进行 WPF 自动化

文章目录 关于1 环境准备2 集成单元测试3 新增基本测试代码4 测试 WPF 程序5 启动测试 关于 参考链接&#xff1a;Get Your WPF Apps Automated With Appium Appium官网&#xff1a;http://appium.io/docs/en/2.0/quickstart 1 环境准备 一、下载 Windows Application Driv…

JVM 虚拟机栈

虚拟机栈概述 背景: 由于跨平台性的设计&#xff0c;Java 的指令都是根据栈来设计的。不同平台 CPU 架构不同&#xff0c;所以不能设计为基于寄存器的优点是跨平台, 指令集小&#xff0c;编译器容易实现&#xff0c;缺点是性能下降&#xff0c;实现同样的功能需要更多的指令 …

CVE-2023-21839 Weblogic RCE

前言 刷B站的时候给我推的一个WebLogic的比较新的漏洞&#xff0c;可以通过此漏洞直接达到RCE进行getShell的效果&#xff0c;于是就简单复现和分析一下&#xff0c;做个记录。 视频链接 漏洞简单分析 此漏洞是属于WebLogic的JNDI注入漏洞&#xff0c;漏洞造成的原因是Weblo…

《创新者的基因》读书笔记

本书是企业创新管理的研究成果&#xff0c;针对个人和企业如何培养、提升商业创新能力给出了行动指南&#xff0c;每一种能力都提供了很多训练小技巧&#xff0c;在此不一一列举&#xff0c;只写自己的读书笔记、对策和思考。 破坏性创新者的基因 发问&#xff1a;目的是提出…

Java字符串详解:概念、特点与常见的使用场景

Java字符串是开发中经常使用到的一种数据类型&#xff0c;使用它可以处理文本、URL、文件路径等多种类型的数据。本文将对Java字符串的概念、特点以及常见使用场景进行详细解释。本文将分为以下几个部分&#xff1a; String的概念和特点Java字符串常量池字符串的不可变性使用e…

LeetCode - 3. 无重复字符的最长子串

写在前面&#xff1a; 题目链接&#xff1a;LeetCode - 3. 无重复字符的最长子串 题目难度&#xff1a;中等 编程语言&#xff1a;C 一、题目描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释…

【RabbitMQ】SpringAMQP

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&am…

快速了解C语言的基本元素

C语言是一种编程语言&#xff0c;和其它语言一样&#xff0c;也定义了自己的语法和词汇。学习C语言&#xff0c;首先要学习C语言的词汇&#xff0c;再学习C语言的语法规则&#xff0c;然后由词汇构成语句&#xff0c;由语句构成源程序&#xff0c;源程序也称为源代码或代码&…