C语言学习——结构体_联合体_枚举用法直通[通俗易懂]

C语言学习——结构体_联合体_枚举用法直通[通俗易懂]一、结构体嵌套#include <stdio.h>// 出生日期:年月日struct sBirthday{ int iYear; int iMonth; int iDay;};// 公民信息struct sSCitizenIDInfo{ char cName[10]; char cSex[4]; sBirthday BirthDate; // 结构体变量…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、结构体嵌套

#include <stdio.h>
// 出生日期:年月日
struct sBirthday
{ 
   
	int iYear;
	int iMonth;
	int iDay;
};
// 公民信息
struct sSCitizenIDInfo
{ 
   
	char cName[10];
	char cSex[4];
	sBirthday  BirthDate;  // 结构体变量作为另一个结构体的成员
	char cAddress[100];
};
int main()
{ 
   
	struct sSCitizenIDInfo sInfo = { 
    "王中华", "女", { 
    2010, 12, 12 }, "北京市朝阳区" };
	struct sSCitizenIDInfo *pCID = &sInfo;
	printf("姓名:%s\n性别:%s\n出生日期:%d 年 %d 月%d 日\n地址:%s\n",pCID->cName,pCID->cSex,pCID->BirthDate.iYear,pCID->BirthDate.iMonth,pCID->BirthDate.iDay,pCID->cAddress);
	return 0;
}

结果为;
在这里插入图片描述

二、结构体数组

所谓结构体数组,是指数组中的每个元素都是一个结构体。在实际应用中,C语言结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。

// 公民信息
struct sSCitizenIDInfo
{ 

char cName[10];
char cSex[4];
sBirthday  BirthDate;
char cAddress[100];
}pCArr[3] = { 

{ 
 "王中华", "男", { 
 2010, 12, 12 }, "北京市朝阳区" },
{ 
 "刘小小", "女", { 
 1990, 2, 22 }, "北京市东城区" },
{ 
 "吴小莉", "女", { 
 2000, 9, 30 }, "北京市海淀区" }
};
#include <stdio.h>
// 出生日期:年月日
struct sBirthday{ 

int iYear;
int iMonth;
int iDay;
};
// 公民信息
struct sSCitizenIDInfo{ 

char cName[10];
char cSex[4];
sBirthday  BirthDate;
char cAddress[100];
}pCArr[3] = { 
	{ 
 "王中华", "男", { 
 2010, 12, 12 }, "北京市朝阳区" },
{ 
 "刘小小", "女", { 
 1990, 2, 22 }, "北京市东城区" },
{ 
 "吴小莉", "女", { 
 2000, 9, 30 }, "北京市海淀区" }
};
int main()
{ 

struct sSCitizenIDInfo *pCID = pCArr;
// 数组下标输出
for (int i = 0; i < 3; i++)
{ 

printf("\n姓名:%s\n性别:%s\n出生日期:%d年%d月%d日\n地址:%s\n", pCArr[i].cName, pCArr[i].cSex, pCArr[i].BirthDate.iYear, pCArr[i].BirthDate.iMonth, pCArr[i].BirthDate.iDay, pCArr[i].cAddress);
}
// 结构指针变量输出
printf("\n-----------------------------------------------------------------------------------\n");
for (int i = 0; i < 3; i++)
{ 

printf("\n姓名:%s\n性别:%s\n出生日期:%d年%d月%d日\n地址:%s\n", (pCID[i]).cName, (pCID[i]).cSex, (pCID[i]).BirthDate.iYear, (pCID[i]).BirthDate.iMonth, (pCID[i]).BirthDate.iDay, (pCID[i]).cAddress);
}
return 0;
}

结果如下:
在这里插入图片描述
在这里插入图片描述

三、联合体

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

union 共用体名
{ 

成员列表......
};

共用体有时也被称为联合或者联合体;

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

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
1、共用体也是一种自定义类型,可以通过它来创建变量:

union data
{ 

int i;
char ch;
double d;
};
union data ud;

2、定义共用体的同时创建变量

union data
{ 

int i;
char ch;
double d;
}ud;

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

union
{ 

int i;
char ch;
double d;
}ud,cd;

四、枚举

在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成本项工作:

如这样:

#define MONDAY 1
#define TUESDAY 2
#define WEDNESDAY 3
#define THURSDAY 4
#define FRIDAY 5
#define SATURDAY 6
#define SUNDAY 7

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
方法一:枚举类型的定义和变量的声明分开

enum DAY
{ 

MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY yesterday;
enum DAY today;
enum DAY tomorrow; //变量tomorrow的类型为枚举型enum DAY
enum DAY good_day, bad_day; //变量good_day和bad_day的类型均为枚举型enum DAY

方法二:类型定义与变量声明同时进行:

enum //跟第一个定义不同的是,此处的标号DAY省略,这是允许的。
{ 

saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //变量workday的类型为枚举型enum DAY
enum week { 
 Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; //变量days的类型为枚举型enum week 
enum BOOLEAN { 
 false, true } end_flag, match_flag; //定义枚举类型并声明了两个枚举型变量

方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:

typedef enum workday
{ 

saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //此处的workday为枚举型enum workday的别名
workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday

五、C语言字节对齐

一、为什么要字节对齐  
   需要字节对齐的根本原因在于CPU访问数据的效率问题。

二、正确处理字节对齐  
   对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按下面的原则对齐:  
   数 组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。
   联 合 :按其包含的长度最大的数据类型对齐。
   结构体: 结构体中每个数据类型都要对齐。

三、什么时候需要设置对齐
在设计不同CPU下的通信协议时,或者编写硬件驱动程序时寄存器的结构这两个地方都需要按一字节对齐。即使看起来本来就自然对齐的也要使其对齐,以免不同的编译器生成的代码不一样.

案例1

#pragma pack (4)
#include <stdio.h>
struct stu
{ 

char sex;
int length;
char name[10];
};
struct stu my_stu;
int main()
{ 

printf("占据:%d字节\n", sizeof(my_stu));
return 0;
}

结果:
在这里插入图片描述
案例分析:
上面定义了对其字节数为4字节,char本身1字节,在这占四位,int四位,char[10]占10位,但最后两位直接算四位,4+4+12=20字节

案例2:


#include <stdio.h>
#pragma pack(1) //让编译器对这个结构作1字节对齐
struct test
{ 

char x1;
short x2;
float x3;
char x4;
int a[3];
double d;
}TT;
//#pragma pack() //取消1字节对齐,恢复为默认4字节对齐
int main()
{ 

printf("char占据:%d字节\n", sizeof(char));
printf("short占据:%d字节\n", sizeof(short));
printf("float占据:%d字节\n", sizeof(float));
printf("char占据:%d字节\n", sizeof(char));
printf("a占据:%d字节\n", sizeof(TT.a));
printf("d占据:%d字节\n", sizeof(TT.d));
printf("\n共计占据:%d字节\n", sizeof(TT));
return 0;
}

结果:
在这里插入图片描述

六、typedef

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/170986.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 京东云服务器免费6月_福利服务器

    京东云服务器免费6月_福利服务器记得是在2010年,那个时候我刚刚开始接触Android不久,Google也还没有离开中国。当时我在上大三,Google举办了一场Android应用开发中国大学生挑战赛,跃跃欲试的我就和同学组队一起参加了。当时我们开发的项目叫做酷欧短信(没错,你们所熟悉的酷欧天气其实就是从这个名字演变过来的),是一款功能比较丰富的短信收发软件。我个人对这个项目当时是非常有信心的,不过最终结果下来却只获得了

    2022年10月14日
  • 增强for循环的语法_增强for循环原理

    增强for循环的语法_增强for循环原理一、概述:也成为【foreach】循环,是JDK1.5版本以后出来的一个高级for循环,专门用来遍历数组和集合的,它的内部原理其实就是iterator迭代器,所以在遍历过程中,不能对集合的元素进行增删操作。二、格式for(元素的数据类型变量名:数组名/集合名{}三、代码演示publicstaticvoidmain(String[]args)…

    2022年10月28日
  • Java(Eclipse,JDK)最新全套下载安装教程[通俗易懂]

    Java(Eclipse,JDK)最新全套下载安装教程[通俗易懂]找了好多博主的博客一篇一篇尝试之后才准备的这篇下载安装教程,亲测实用!!!一、Eclipse下载官方下载网址:Eclipse下载地址

  • java实现仿QQ即时聊天[通俗易懂]

    java实现仿QQ即时聊天[通俗易懂]这是我的java大作业,这里就直接贴上我的实验报告了。1.1项目介绍这是一个模仿QQ的即时聊天软件,可以通过运行在本地的服务端,实现两个客服端之间的通信,即聊天。采用的是javafx架构作为GUI设计架构,个人认为优点是可以自己设计css,使界面达到美观的目的。本项目共有登录、注册、重置密码、主界面发消息、添加好友、好友列表项、查看聊天记录、删除聊天记录、未读消息提醒、好友主页、我的主页等模块…

  • php和asp网络验证码,Verifycode 1个简单的网页图片验证码的示例程序,基本上现有 字和字母都可以识别。 WEB(ASP,PHP,…) 238万源代码下载- www.pudn.com…

    php和asp网络验证码,Verifycode 1个简单的网页图片验证码的示例程序,基本上现有 字和字母都可以识别。 WEB(ASP,PHP,…) 238万源代码下载- www.pudn.com…文件名称:Verifycode下载收藏√[54321]开发工具:C#文件大小:3201KB上传时间:2014-06-12下载次数:4详细说明:1个简单的网页图片验证码的示例程序,基本上现有的数字和字母都可以识别。-asimplewebverifycodesampleprojectwithnumberandalphabetrecognit…

  • mac系统安装win10双系统「建议收藏」

    mac系统安装win10双系统「建议收藏」一个月前,为了在家里学习单片机,在macbookair系统基础上,安装了win10,搞了一个双系统。在安装之前,看了很多资料,基本上提到两点,一个是准备win10镜像,一个是准备win10安装启动程序,而且至少需要一个U盘,有的也说需要两个,一个用来装win10镜像,一个用来装win10启动程序。最后动手安装的时候,一个U盘也没有使用,直接把win10镜像下载到mac系统中,然后启动mac上的磁盘管理工具,按照提示,傻瓜式的进行下一步。有两个地方需要我们手动设…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号