自定义类型结构体(上)

news2024/11/28 9:45:42

目录

  • 结构体类型的声明
    • 结构体的概念
    • 结构体的声明
    • 特殊的声明
    • 结构的自引用
  • 结构体变量的创建和初始化
  • 结构成员访问操作符

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐓🏀 python

结构体类型的声明

结构体的概念

结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量
举个例子:杰克的英语只考了60分,你需要将杰克考试的信息填在一张表中,那么表中的信息应该有姓名 班级 学号 分数,表就是杰克信息的集合,而姓名班级等等则都是表中成员,姓名具体对应的名称为杰克,则就称为成员变量

从上面的例子不难看出,结构体中的成员可以是不同类型的变量,我们再回想一下数组,数组的每个成员是不是都是同一种类型的变量,由于结构体和数组都是一些值的集合,因此我推断出数组是结构体的特殊情况(虽然表现的形式有区别)

结构体的声明

struct tag(tag为你自己设定的名称)
{
	member-list;//成员列表
}variable-list;//变量列表(可有可无)

我们依然用上面的例子:

//描述杰克的英语成绩
struct Stu
{
	char name[20];//名字
	int class[20];//班级
	char id[20];//学号
	char Score[20];//分数
};

如果我们需要对杰克 约翰 等人填写信息的话,我们需要创建多个变量
方式一:

struct Stu
{
	char name[20];//名字
	int class[20];//班级
	char id[20];//学号
	char Score[20];//分数
}s1,s2,s3;//是三个结构体变量(是全局变量)

方式二:

struct Stu
{
	char name[20];//名字
	int class[20];//班级
	char id[20];//学号
	char Score[20];//分数
}
int main()
{
struct stu s4,s5,s6//局部变量
return 0;
}

特殊的声明

在声明结构的时候,可以不完全的声明比如:

//匿名结构体类型
struct
{
	int a;
	char b;
	float c;
}x;//只能用一次
struct
{
	int a;
	char b;
	float c;
}a[20], * p;//只能用一次

我们来看一段代码:

struct
{
	char name[20]
}a;
struct
{
	char name[20]
}*p;
int main()
{
	p = &a;
	return 0;
}

在这里插入图片描述
虽然两个结构体里面的变量是一样的,但是在运行时VS仍然会把他认为是两种不同的结构体,既是你将b结构体的地址传给p,也不能让p变成b的结构体

结构的自引用

在结构中包含⼀个类型为该结构本身的成员是否可以呢?
比如:

struct Node
{
	int data;
	struct Node next;
};

仔细分析,其实是不行的,因为一个结构体中再包含一个同类型的结构体变量,这样结构体变量的大小就会无穷的大,是不合理的
在学到这里时我其实想到了一个数学例子
在这里插入图片描述
虽然这个结果是可以求极限的,但是这个嵌套的方式和这道题非常类似

正确的自引用方式:

struct Node
{
	int data;
	struct Node* next;
};
如果我们用的是同类型结构体指针struct Node* next,我们就可以算出内存大小了,因为*next是具体指向一个地址,有且只有一个,所以内存不会无限大

在结构体自引用使用的过程中,夹杂了typedef对匿名结构体类型重命名,也容易引入问题,看看下面的代码

typedef struct
{
	int data;
	Node* next;
}Node;

结果是不行的,因为Node是对前面的匿名结构体类型的重命名产生的,但是在匿名结构体内部提前使用Node类型来创建成员变量,导致结构体还没有完全创建出来就拿出来用,这很明显是不行的.

解决方案如下:定义结构体不要使用匿名结构体了

typedef struct Node
{
	int data;
	struct Node* next;
}Node;

这里要和上面的例子要区别开,因为在一开始我们就让结构体类型为Node,所以在中间我们可以直接拿来用

结构体变量的创建和初始化

有了结构体类型,那如何定义变量,其实很简单,结构体变量的初始化使用{}

struct Point//描述坐标的一个点
{
	int x;
	int y;
}p1; //声明类型的同时定义变量p1

struct Point p2; //定义结构体变量p2

//初始化:定义变量的同时赋初值。
struct Point p3 = { x, y };

struct Stu //类型声明
{
	char name[15];//名字
	int age; //年龄
};
struct Stu s = { "zhangsan", 20 };//初始化

struct Node
{
	int data;
	struct Point p;
	struct Node* next;
}n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化
//如果要打印struct Node中的struct Point p的话
printf("%d %d",Node.p.x,Node.p.y)

struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化

指示器初始化方式(C99),这种方式允许不是按照成员顺序初始化

struct Stu
{
	char name[15];
	int age;
};
struct Stu s = {.age=20, .name="zhangsan"};//初始化

.age就可以准确的将20赋值给age,这样就可以不按照成员顺序初始化了

结构成员访问操作符

结构成员访问操作符有两个一个是 . ,一个是 -> .
形式如下:

结构体变量.成员变量名
结构体指针—>成员变量名

我们看一个例子:

#include <stdio.h>
#include <string.h>
struct Stu
{
	char name[15];//名字
	int age; //年龄
};
void print_stu(struct Stu s)
{
	printf("%s %d\n", s.name, s.age);
}
void set_stu(struct Stu* ps)
{
	strcpy(ps->name, "李四");
	ps->age = 28;
}
int main()
{
	struct Stu s = { "张三", 20 };
	print_stu(s);
	set_stu(&s);
	print_stu(s);
	return 0;
}

在这里插入图片描述

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

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

相关文章

linux下df -h 命令一直卡住的解决方法

在Linux中&#xff0c;偶尔遇到用 df -h 查看磁盘情况时&#xff0c;一直卡住无法显示结果。 解决方法&#xff1a; 1、首先使用strace追踪到底执行到哪里卡住 $ strace df -h 2、如果没有strace命令则进行安装 $ yum install strace -y 3、显示出卡住的地方&#xff0c;如…

[0xGame 2023 公开赛道] week4 crypto/pwn/rev

最后一周结束了&#xff0c;难度也很大&#xff0c;已经超出我这认为的新生程度了。 crypto Orac1e 先看题&#xff0c;题目先是给了加密过的flag然后提供不限次数的解密&#xff0c;不过仅提供解密后unpad的结果。 from Crypto.Util.number import * from Crypto.Cipher i…

WinCC7.5 将归档数据打印到MSHGrid(不是MSFlexGrid控件)

参考网址&#xff1a;https://www.cnblogs.com/fishingsriver/p/14397431.html 新建变量 MSHGrid控件 查询按钮 Sub OnClick(ByVal Item) Dim myCatalog,myDS,PCN…

【python】路径管理+路径拼接问题

路径管理 问题相对路径问题绝对路径问题 解决os库pathlib库最终解决 问题 环境&#xff1a;python3.7.16 win10 相对路径问题 因为python的执行特殊性&#xff0c;使用相对路径时&#xff0c;在不同路径下用python指令会有不同的索引效果&#xff08;python的项目根目录根据执…

【嵌入式】HC32F07X CAN通讯配置和使用配置不同缓冲器以连续发送

一 背景说明 使用小华&#xff08;华大&#xff09;的MCU HC32F07X实现 CAN 通讯配置和使用 二 原理分析 【1】CAN原理说明&#xff08;参考文章《CAN通信详解》&#xff09;&#xff1a; CAN是控制器局域网络(Controller Area Network, CAN)的简称&#xff0c;是一种能够实现…

公司上网行为监控能监控到什么

公司上网行为监控是一个备受关注的话题&#xff0c;它可以监控员工的网络行为&#xff0c;保护企业的机密和数据安全。但是&#xff0c;这种监控行为也会涉及到员工的隐私权和数据安全问题。 公司上网行为监控能监控到什么&#xff1a; 1、访问网站精确到员工信息、计算机名称…

uni-starter 使用常见问题

1. Invalid uni-id config file 没有找到uni-id文件导致 需要在uniCloud-aliyun/cloudfunctions/common/uni-config-center/uni-id/下新建 config.json 如果没有uni-id 就新建一个。 注意&#xff1a;config.json是一个标准json文件&#xff0c;不支持注释 uni-starter 按照…

git简单介绍,回车换行问题,倒计时+进度条小程序的实现+代码

目录 git--版本控制工具 介绍 使用 小程序 引入 回车换行问题 缓冲区问题 倒计时 分析 代码 进度条 分析 代码 git--版本控制工具 首先,我们需要下载git : yum install git 介绍 Git是一种分布式版本控制系统&#xff0c;用于跟踪文件和目录的变化并协调多个人之…

ACID模型

ACID 是数据库管理系统&#xff08;DBMS&#xff09;中用来确保事务处理正确性和可靠性的四个特性的首字母缩写。ACID 是指原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08…

亚马逊美国站书包,书皮,便当盒,铅笔盒CPC认证

在人们生活中学习用品的种类十分丰富&#xff0c;并且随着社会经济以及现代电子科技的飞速发展&#xff0c;传统的学习用品已经不能满足人们对学习用品的需求&#xff0c;电子学习用品异军突起&#xff0c;受到了越来越多年轻人的青睐。我国庞大的学习用品消费群体每年用于购买…

字体文件名称成中的Bold, Light,Italic,Regular, Medium是什么意思?

解释 字体文件名&#xff1a; IntelOneMono-Bold.ttf其中IntelOneMono字体名称 Bold 字体的样式 .ttf字体后缀 样式英文 中文Bold粗体BoldItalic粗体斜体Italic斜体Light细体LightItalic斜细体Medium中等MediumItalic中等斜体Regular标准以下来自鸿蒙字体以下来自鸿蒙字体TC…

CSS标点符号换行问题

最近遇到一个奇怪的现象,元素中中文文本正常显示,但是加了一堆符号后中文文本居然换行了. div{width: 200px;border: 1px solid blue;word-break: break-all;} <div>文本</div>经过研究发现&#xff0c;因为标点符号不允许出现在行首和行尾&#xff0c;连带着符号…

【Linux】第八站:gcc和g++的使用

文章目录 一、解决sudo命令的问题二、Linux编译器-gcc/g1.gcc的使用2.g的使用 三、gcc编译链接过程1.预处理2.编译&#xff08;生成汇编&#xff09;3.汇编&#xff08;生成机器可识别代码&#xff09;4.链接&#xff08;生成可执行文件或库文件&#xff09;5.一些选项的意义 四…

Serverless与AI驱动,阿里云数据库核心能力全面升级!

11月1日&#xff0c;2023杭州云栖大会上&#xff0c;阿里云瑶池数据库宣布已全面实现Serverless化&#xff0c;并接入通义等大模型能力&#xff0c;大幅提升数据库一站式及智能化水平。同时&#xff0c;PolarDB Always On系列推出3大重磅升级&#xff0c;首个数据智能助手DMS C…

阿里云2核2G3M云服务器99元/年,新老同享,续费不涨价!

2023年阿里云双11活动正在火热进行中&#xff0c;推出了一款面向个人开发者、学生、小微企业的年度爆款套餐&#xff0c;2核2G3M云服务器99元/年&#xff0c;新老同享&#xff0c;续费不涨价&#xff01; 一、活动入口 活动地址&#xff1a;传送门>>> 二、活动详情 …

【标准化封装 钽电容封装】Tantalum Capacitors 各种壳

〇、引言 钽电容你见到的是什么封装&#xff1f;7343&#xff1f;那是D壳还是E壳&#xff1f; 有没有PCB焊接调试好&#xff0c;结构缺盖不住盖子了&#xff1f;&#xff1f;&#xff1f; 一、正文 上图片 这个叫黑钽 这个叫黄钽 这个叫啥我也不知道 二、封装 典型厂家壳…

stm32 定时器中断

目录 定时器分类 通用定时器框图 时钟源 内部时钟&#xff08;CK_INT&#xff09; 外部时钟模式 1&#xff08; TI1、 TI2&#xff09; 时钟信号输入引脚 滤波器 如果来自外部的时钟信号的频率过高或者混杂有高频干扰信号的话&#xff0c;我们就需要使用滤波器对信号重新…

入栏需看——管理类联考——英语——知识+记忆篇——导航页

文章目录 Section I Use of English——完型填空Section II Reading ComprehensionPart A——阅读理解 A 节&#xff08;Part A&#xff09;&#xff08;四篇&#xff09;Part B——阅读理解 B 节&#xff08;Part B&#xff09;&#xff08;只有一篇&#xff09;Part C——翻译…

Linux shell编程学习笔记19:until循环语句

Linux shell编程中的until语句&#xff0c;在功能上与其它编程语言一致&#xff0c;但在结构与其它编程语言又不太一样。在大多数编程语言中&#xff0c;until语句的循环条件表达式一般位于循环体语句的后面&#xff0c;但是在Linux shell编程中&#xff0c;until语句的循环条件…

教您如何去除照片上的水印!

许多网友都在寻找方法去除照片上的水印&#xff0c;水印通常用于保护版权或标识来源&#xff0c;但有时候我们可能需要使用带有水印的照片&#xff0c;却又不希望水印影响观感&#xff0c;今天我将向大家介绍两种有效的方法&#xff0c;帮助解决“如何去除照片上的水印”这一难…