学长教你学C-day11-C语言结构体、枚举、联合体

news2024/9/20 14:45:57

“前面我们学习了数组,从数据类型来看,数组就是具有相同数据类型的变量集合;从内存空间来看,数组就是一串由相同大小的数据空间组成的较大的内存空间。那么结构体是什么呢?从内存角度讲,结构体也是一块地址空间,它的空间大小是由里面定义的变量大小决定的。它和数组最大的不同就在于,结构体中既可以放相同类型的变量,也可以放不同类型的变量,从而使得不同的数据类型放在一块空间中,并且也可以申请多个连续的相同的结构体空间组成结构体数组。”

语法定义:

struct 结构体名{
    结构体所包含的变量或数组
};

举个例子:定义一个学生结构体,包含姓名,学号和分数。

struct Student{
	char* name;
	int id[20];
	float score;
};

定义一个结构体变量使用结构体处理数据:

#include<stdio.h>

struct Student{
	char* name;
	int id[20];
	float score;
};

int main(){
	//定义结构体变量 
	Student stu1,stu2;
	//给结构体变量stu1赋值 
	stu1.id[0]=10010;
	stu1.name="小明";
	stu1.score=100;
	//给结构体变量stu2赋值
	stu2.id[0]=10011;
	stu2.name="小红";
	stu2.score=99;
	//输出结构体变量中的值 
	printf("%d-%s-%f\n",stu1.id[0],stu1.name,stu1.score); 
	printf("%d-%s-%f\n",stu2.id[0],stu2.name,stu2.score); 
	return 0;
}

输出:

 定义一个学生结构体数组存储学生信息并打印:

#include<stdio.h>

struct Student{
	char* name;
	int id;
	float score;
};

int main(){
	int n=0;
	//定义结构体变量 
	Student stu[100];
	//请输入学生人数
	printf("请输入学生人数:");
	scanf("%d",&n); 
	for(int i=0;i<n;i++){
		printf("请输入第%d位学生学号:",i+1);
		scanf("%d",&stu[i].id); 
		printf("请输入第%d位学生姓名:",i+1);
		scanf("%s",&stu[i].name); 
		printf("请输入第%d位学生得分:",i+1);
		scanf("%f",&stu[i].score); 
	} 
	printf("--------------输出学生成绩信息表--------------\n");
	for(int i=0;i<n;i++){
		printf("%d\t%s\t%f\n",stu[i].id,&stu[i].name,stu[i].score);	
	} 
	return 0;
}

输出:

 枚举

枚举类型的定义形式为:

enum typeName{ valueName1, valueName2, valueName3, ...... };

enum是一个新的关键字,专门用来定义枚举类型,这也是它在C语言中的唯一用途;typeName是枚举类型的名字;valueName1, valueName2, valueName3, ......是每个值对应的名字的列表。注意最后的;不能少。

 

#include <stdio.h>
int main(){
    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
    scanf("%d", &day);
    switch(day){
        case Mon: puts("Monday"); break;
        case Tues: puts("Tuesday"); break;
        case Wed: puts("Wednesday"); break;
        case Thurs: puts("Thursday"); break;
        case Fri: puts("Friday"); break;
        case Sat: puts("Saturday"); break;
        case Sun: puts("Sunday"); break;
        default: puts("Error!");
    }
    return 0;
}

 输出:

 联合体

通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员。在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:

union 共用体名{
    成员列表
};

共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。

结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

共用体也是一种自定义类型,可以通过它来创建变量,例如:

共用体也是一种自定义类型,可以通过它来创建变量,例如:

  1. union data{
  2. int n;
  3. char ch;
  4. double f;
  5. };
  6. union data a, b, c;

上面是先定义共用体,再创建变量,也可以在定义共用体的同时创建变量:

  1. union data{
  2. int n;
  3. char ch;
  4. double f;
  5. } a, b, c;

如果不再定义新的变量,也可以将共用体的名字省略:

  1. union{
  2. int n;
  3. char ch;
  4. double f;
  5. } a, b, c;

共用体 data 中,成员 f 占用的内存最多,为 8 个字节,所以 data 类型的变量(也就是 a、b、c)也占用 8 个字节的内存,请看下面的演示:

#include <stdio.h>
union data{
    int n;
    char ch;
    short m;
};
int main(){
    union data a;
    printf("%d, %d\n", sizeof(a), sizeof(union data) );
    a.n = 0x40;
    printf("%X, %c, %hX\n", a.n, a.ch, a.m);
    a.ch = '9';
    printf("%X, %c, %hX\n", a.n, a.ch, a.m);
    a.m = 0x2059;
    printf("%X, %c, %hX\n", a.n, a.ch, a.m);
    a.n = 0x3E25AD54;
    printf("%X, %c, %hX\n", a.n, a.ch, a.m);
   
    return 0;
}

运行结果:

 

这段代码不但验证了共用体的长度,还说明共用体成员之间会相互影响,修改一个成员的值会影响其他成员。

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

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

相关文章

PEG化芘衍生物——Pyrene-PEG-Acid,Pyrene-PEG-COOH,芘丁酸-聚乙二醇-羧基

一&#xff1a;产品描述 1、名称 英文&#xff1a;Pyrene-PEG-COOH&#xff0c;Pyrene-PEG-Acid 中文&#xff1a;芘丁酸-聚乙二醇-羧基 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a; Carboxylic acid PEG Pyrene PEG 4、分子量&#xff1a;可定制2000、1000、340…

2022个人年度总结:别让内心的烦躁和焦虑,占据本就不多的热情。

在从毕业一直到现在&#xff0c;我都会写一篇关于自己的从技术、商业、人情世故以及未来展望的博文&#xff0c;以至于归纳每个时期的自己&#xff0c; 走在互联网开发的边缘&#xff0c;不得不抽出时间鞭策自己学习新知识&#xff0c;未知的知识是 充满好奇的&#xff0c; 就好…

Makefile学习⑧:Makefile中通用部分做公共头文件

Makefile学习⑧&#xff1a;Makefile中通用部分做公共头文件 创建2个文件夹Demo1和Demo2,2个文件夹中的文件完全一样&#xff0c;但是命名不一样。 博主创建的如下&#xff0c;内容沿用前几章的函数文件。 这两个Makefile中的内容除了目标文件名和依赖文件名不一致&#xff0…

轻松实现一个Python+Selenium的自动化测试框架

首先你得知道什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE&#xff…

知识抽取-实体及关系抽取

信息抽取的三个最重要&#xff0c;最受关注的子任务&#xff1a; 实体抽取 命名实体识别&#xff0c;包括实体检测&#xff08;find)和分类&#xff08;classify) 关系抽取。 通常我们所述的三元组抽取&#xff0c; 一个谓词&#xff08;predicate)带2个形参&#xff08;argum…

MySQL学习记录(9)存储引擎

文章目录6、InnoDB存储引擎6.1、逻辑存储结构6.2、架构6.2.1、概述6.2.2、内存结构6.2.3、磁盘结构6.2.4、后台线程6.3、事务原理6.3.1、事务基础6.3.2、redo log日志6.3.3、undo log日志6.4、MVCC6.4.1、基本概念6.4.2、记录中隐藏字段6.4.3、undo log日志6.4.4、readview6.4.…

算法基础(二):数组知识点及题型讲解

算法基础&#xff08;二&#xff09;&#xff1a;数组知识点及题型讲解1 数组定义2 Python数组常用操作2.1 创建数组2.2 添加元素2.3 访问元素2.4 更新元素2.5 删除元素2.6 获取数组长度2.7 遍历数组2.8 查找某个元素2.9 数组排序3 力扣题目训练一些算法基础知识点和leetcode题…

汇编语言1基础知识

机器语言 机器语言是机器指令的集合&#xff0c;即计算机可以执行的指令。 机器指令由一连串二进制数字构成&#xff0c;计算机中用高低电平表示。高电平为1&#xff0c;低电平为0。 早期通过在纸带上打孔输入计算机运算。打孔为1&#xff0c;不打孔为0。 上图出自剧版三体第…

c语言tips-【gcc详细介绍】

0. 什么是gcc GCC 原名为 GNU C语言编译器&#xff08;GNU C Compiler&#xff09;GCC&#xff08;GNU Compiler Collection&#xff0c;GNU编译器套件&#xff09;是由 GNU 开发的编程语言译器。 GNU编译器套件包括C、C、 Objective-C、 Java、 Ada 和 Go语言前端&#xff0c…

【GPLT 二阶题目集】L2-009 抢红包

没有人没抢过红包吧…… 这里给出N个人之间互相发红包、抢红包的记录&#xff0c;请你统计一下他们抢红包的收获。 输入格式&#xff1a; 输出格式&#xff1a; 按照收入金额从高到低的递减顺序输出每个人的编号和收入金额&#xff08;以元为单位&#xff0c;输出小数点后2位&a…

ISIS与OSPF的双点双向简介与配置,双点双向中存在的问题(次优路径与环路风险)

2.4.0 ISIS与OSPF的双点双向简介与配置&#xff0c;双点双向中存在的问题 关于双点双向的相关概念 单点双向 网络中连接外网的设备称为出口网关设备 &#xff0c;通常小型网络中仅有一台出口网关设备。 网络中仅存在一台出口设备与外网设备对接时相互引入对端的路由&#xf…

学长教你学C-day12-C语言函数

不知不觉&#xff0c;小刘已经讲了十一天C语言了&#xff0c;语法、数据结构、数组、结构体、指针的概念和使用大家都已经了然于心&#xff0c;但是想用C语言开发一个有用的程序还需要一个很关键的部分&#xff0c;那就是编写“函数”。 “函数这个名字大家肯定都不陌生&#x…

ZooKeeper架构篇 - 分布式协调服务ZooKeeper

前言 本文基于 ZooKeeper 3.8.0 版本。 ZooKeeper集群搭建 准备四台服务器&#xff0c;IP地址分别为10.211.55.6、10.211.55.7、10.211.55.8、10.211.55.9 下载并解压 ZooKeeper 文件&#xff0c;四台服务器进入 data 目录分别创建一个 myid 文件&#xff0c;文件内容分别为…

vue全家桶(二)组件化开发

vue全家桶&#xff08;二&#xff09;组件化开发1.组件化开发思想2.组件注册2.1局部注册2.2全局注册Vue.component1.注意事项&#xff1a;2.组件的命名方式3.组件间的交互3.1父组件向子组件传值-props属性值类型1.组件化开发思想 标准分治重用组合 2.组件注册 vue 注册组件的…

《动手学深度学习》笔记一 ------机器学习中的基础概念

写在前面&#xff1a;本文按照书中的脉络做的笔记&#xff0c;包含概念的定义、自己的理解以及阅读时的小思考。感受&#xff1a;深度学习很奥妙&#xff0c;很有趣&#xff01; 1.2机器学习中的关键组件 可以⽤来学习的数据&#xff08;data&#xff09;&#xff1b;如何转换…

直接在Notepad++中运行GO语言

建议先阅读并实践&#xff08;配置notepad支持go语言语法着色(高亮)&#xff09;:https://mp.csdn.net/mp_blog/creation/editor/new/1287591911.Windows上安装Go语言开发包参考链接&#xff1a;http://c.biancheng.net/view/3992.html1.1.下载Go语言开发包可以在Go语言官网 &a…

大聪明教你学Java | 深入浅出聊 Mybatis 的一级缓存和二级缓存

前言 &#x1f34a;作者简介&#xff1a; 不肯过江东丶&#xff0c;一个来自二线城市的程序员&#xff0c;致力于用“猥琐”办法解决繁琐问题&#xff0c;让复杂的问题变得通俗易懂。 &#x1f34a;支持作者&#xff1a; 点赞&#x1f44d;、关注&#x1f496;、留言&#x1f4…

【头歌】函数的递归调用

第1关&#xff1a;编写递归函数方法求x的n次方 (要求n>0)任务描述本关任务&#xff1a;编写递归函数方法求x的n次方 (要求n>0)。相关知识递归法在定义一个过程或函数时出现调用本过程或本函数的成分&#xff0c;称之为递归。若调用自身&#xff0c;称之为直接递归。若过程…

论文笔记:SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS

ICLR 2017 1 abstract和intro部分 问题的setting 在图上进行节点分类&#xff0c;其中只有一部分节点有label ——>基于图的半监督学习传统的方法是使用平滑正则 其中L0表示图中有监督部分的lossf是神经网络&#xff0c;ΔD-A表示unnormalized的拉普拉斯矩阵 这种方…

Blender 物理属性 (五)动态绘画

文章目录动态绘画简介.以小船划过水面产生波纹为例.波浪属性.动态绘画简介. 1 动态绘画可以让一个物体在另一个物体上绘制东西 2 动态绘画至少需要两个物体&#xff0c;一个作为画布&#xff0c;另一个作为笔刷 3 两个物体必须接触才有效果 以小船划过水面产生波纹为例. 1 为…