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

2023-05-16

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥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;
}

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

在这里插入图片描述

大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【c语言】结构体详解 | 结构体数组/指针 的相关文章

随机推荐

  • 无人机地面站定制开发流程分享

    说到国外市场 xff0c 无人机市场堪称火爆 xff0c 究其原因 xff0c 是由于 Mission Planner的多功能性 xff0c 全方位涵盖了调试 飞行 模拟等各种功能 xff0c 但福祸相倚 xff0c Mission Pla
  • matlab函数之bsxfun

    bsxfun xff08 fun A B xff09 偶然间发现了这个函数 xff0c 强大得不得了呀 xff0c 它的作用是 xff1a 对两个矩阵A和B之间的每一个元素进行指定的计算 xff08 函数fun指定 xff09 xff1b
  • PyCharm使用技巧记录(一)如何查看变量

    为了方便自己以后查阅 xff0c 记录下使用PyCharm时的一些小技巧 正在学习Python xff0c 在调试Python程序时 xff0c 遇到了一个非常大的问题 xff1a 如何能够方便地查看变量的取值呢 xff1f 由于使用mat
  • 如何在ubuntu下使用Github?

    安装Git 一个全新的ubunt系统 xff0c 需要安装Git xff08 系统是不具有该工具的 xff09 xff0c 方法如下 xff1a 在terminel中输入如下命令 xff1a sudo apt span class hljs
  • Docker学习系列(一):windows下安装docker

    本文目录如下 windows按照docker的基本要求具体安装步骤开始使用安装远程连接工具连接docker安装中遇到的问题Docker的更新Docker中的jupyterwindows下使用docker的常用命令 windows下安装doc
  • Docker学习系列(三):Ubuntu下使用Docker的基本指令记录及一些注意事项

    最近发现极客学院docker教程 xff0c 还不错 xff0c 可以参考 1 Dockerhub下载镜像 注 xff1a Dockerhub地址 有两种方式可以获得新的镜像 直接从dockerhub下载编译好的image xff08 该编
  • 安装visual studio 2012,并配置opencv

    在同学的帮助下 xff0c 终于成功配置了vs 43 opencv xff0c 将详细过程记录在此 xff0c 方便以后查阅 参考1 本文目录 安装vs2012安装opencv在vs2012中配置opencv测试opencv是否配置成功关于
  • Ubuntu下如何安装TensorFlow

    本文目录 引言基于Anaconda的tensorflow安装 1 下载linux版本的Anaconda安装包2 安装Anaconda 利用anaconda安装tensorflow 1 建立一个 conda 计算环境2 激活环境使用 cond
  • Visualizing and Understanding Convolutional Networks

    Matthew D Zeiler xff0c Rob Fergus Visualizing and Understanding Convolutional Networks CVPR2014 论文下载 推荐一篇比较好的blog xff1a
  • 对极几何基本概念

    对极几何 xff08 Epipolar Geometry xff09 描述的是两幅视图之间的内在射影关系 xff0c 与外部场景无关 xff0c 只依赖于摄像机内参数和这两幅试图之间的的相对姿态 什么是对极几何粗略概念对极几何相关的一个重要
  • Python·Win10通过Anaconda安装python和Jupyter(python2.7为例)

    Python Win10通过Anaconda安装python和Jupyter xff08 python2 7为例 xff09 标签 xff08 空格分隔 xff09 xff1a 软件安装 管理 使用 Python 本文主要讨论如何利用Ana
  • Ubuntu14.04安装build-essential失败,包依赖问题如何解决?

    正在读取软件包列表 完成 正在分析软件包的依赖关系树 正在读取状态信息 完成 有一些软件包无法被安装 如果您用的是 unstable 发行版 xff0c 这也许是 因为系统无法达到您要求的状态造成的 该版本中可能会有一些您需要的软件 包尚未
  • 最优化理论·非线性最小二乘

    最优化理论 非线性最小二乘 标签 xff08 空格分隔 xff09 xff1a 数学 非线性最小二乘问题是椭圆拟合中最易遇到的优化问题 xff0c 本文主要对非线性二乘的基本分析做简单介绍 1 什么是最小二乘问题 目标函数能够写为m个函数平
  • 所有线段的交点-初级篇

    所有线段的交点 初级篇 标签 xff08 空格分隔 xff09 xff1a 计算机视觉 图形学 所有线段的交点 初级篇 参考 xff1a 计算几何 算法与应用 邓俊辉 译 清华大学出版社 本文以一个小例子介绍如何计算所有线段交点 xff0c
  • 服务器docker使用

    这篇文章是我给自己的一个记录 xff0c 有些名词可能写的不专业 xff0c 请见谅 docker里面有两个概念 xff0c 一个是镜像 xff0c 一个是容器 镜像可以看做是类 xff0c 容器就是类的实例 在学院的服务器上 xff0c
  • MPC模型预测控制

    这篇主要讲一下模型预测控制 xff0c 如果对PID控制了解的同学 xff0c 那效果更好 如果不了解PID控制 xff0c 还是熟悉下比较好 模型预测控制 xff0c 顾名思义 xff0c 基于模型 xff0c 预测未来 xff0c 进行
  • MPC自学资料总结

    1 书籍 xff1a 无人驾驶车辆模型预测控制 2 视频 xff1a https ww2 mathworks cn videos understanding model predictive control part 1 why use m
  • [授权发表]基于 VNCServer + noVNC 构建 Docker 桌面系统

    by Falcon of TinyLab org 2015 05 02 最初发表 xff1a 泰晓科技 聚焦嵌入式 Linux xff0c 追本溯源 xff0c 见微知著 xff01 原文链接 xff1a 基于 VNCServer 43 n
  • 【c语言】字符串输出方式 | API仿真

    创作不易 xff0c 本篇文章如果帮助到了你 xff0c 还请点赞 关注支持一下 gt x16966 lt 主页专栏有更多知识 xff0c 如有疑问欢迎大家指正讨论 xff0c 共同进步 xff01 给大家跳段街舞感谢支持 xff01 c语
  • 【c语言】结构体详解 | 结构体数组/指针

    创作不易 xff0c 本篇文章如果帮助到了你 xff0c 还请点赞 关注支持一下 gt x16966 lt 主页专栏有更多知识 xff0c 如有疑问欢迎大家指正讨论 xff0c 共同进步 xff01 x1f525 c语言系列专栏 xff1a