【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析

这篇具有很好参考价值的文章主要介绍了【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、结构体概述及定义

1、概念

2、定义方式

方式1:先定义结构体类型,再定义结构体变量

方式2:定义结构体类型的同时定义结构体变量

方式3:定义一次性结构体

二、结构体变量的初始化

1、一般初始化

2、清空结构体变量:使用memset

3、键盘输入给结构体变量中成员赋值

 4、单独操作结构体中的成员

 5、相同类型的结构体变量之间整体赋值

 三、结构体嵌套结构体

四、结构体数组 

1、初始化赋值

2、 键盘输入给结构体赋值

 五、结构体指针变量

1、 结构体指针变量

2、结构体数组元素的指针变量

六、结构体的指针成员

        1、指针成员

        2、结构体的指针成员指向堆区 

 3、浅拷贝问题

4、结构体在堆区 结构体的指针成员指向堆区。(了解)

5、结构体指针数组在堆区、结构体在堆区、结构指针成员在堆区(了解) 

七、结构体的内存分配对齐规则

1、自动对齐规则

2、结构体嵌套结构体 自动对齐规则

 3、强制对齐

八、结构体的位域

1、位域的概念

 2、防止位溢出

3、另起一个存储单元

 4、无意义位段

 九、共用体union

 十、枚举


一、结构体概述及定义

1、概念

一种或多种基本类型构造类型(数组)都叫数据结构,
结构体是一种或多种基本类型构造类型(数组)数据的集合,即数据结构的集合

2、定义方式

结构体定义由关键字 struct 和结构体名组成

方式1:先定义结构体类型,再定义结构体变量

struct stu
{
    int num;
    char name[10];
};//定义结构体stu
struct stu lucy;//定义结构体变量lucy

方式2:定义结构体类型同时定义结构体变量

struct stu
{
    int num;
    char name[10];
}lucy;//定义结构体stu同时定义结构体变量lucy

方式3:定义一次性结构体

struct 
{
    int num;
    char name[10];
}lucy;

 注:结构体变量可以与成员名相同。

访问成员方式:lucy.num(继承类型,int型) lucy.name(char型,数组名代表首元素地址)

定义结构体类型及其成员时系统不分配空间,并且定义类型一般不能给成员变量赋值

二、结构体变量的初始化

1、一般初始化

struct stu
{
    int num;
    char name[10];
};
void test()
{    
    //结构体变量的初始化,必须遵循成员的顺序以及类型
    struct stu lucy={100,"lucy"};
    printf("%d %s",lucy.num,lucy.name);
}

2、清空结构体变量:使用memset

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

3、键盘输入给结构体变量中成员赋值

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

 4、单独操作结构体中的成员

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

 5、相同类型的结构体变量之间整体赋值

三种方式:

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

 三、结构体嵌套结构体

定义:

struct stu
{
	int num;
	char name[10];
	struct data data;//嵌套结构体变量data
};
struct data
{
	int year;
	int month;
	int day;
};

初始化及输出:

	struct stu lucy = { 111,"lucy",{2002,3,7} };
	printf("%d %s\n", lucy.num, lucy.name);
	printf("%d %d %d", lucy.data.year, lucy.data.month, lucy.data.day);

四、结构体数组 

        结构体数组:本质是数组 每个元素结构体

1、初始化赋值

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

2、 键盘输入给结构体赋值

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

 五、结构体指针变量

1、 结构体指针变量

        本质是指针变量 保存的是结构体变量的地址

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

2、结构体数组元素的指针变量

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

六、结构体的指针成员

        1、指针成员

                指针变量作为结构体中的成员

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

        2、结构体的指针成员指向堆区 

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

 3、浅拷贝问题

        相同类型的结构体变量整体赋值时,如果结构体中没有指针成员赋值不会出现浅拷贝。 如果结构体中有指针成员 赋值 容易造成浅拷贝

        浅拷贝出现的问题:相同类型的结构体变量赋值导致各个结构体变量的指针成员指向同一处堆区空间,而各个结构体独立释放指针成员指向的空间时,造成同一处堆区空间被释放多次

struct stu bob;
bob = lucy;//浅拷贝

        解决方法:如果结构体中有指针成员 尽量使用深拷贝

struct stu bob;
bob.name = (char *)calloc(1, 128);
bob.num = lucy.num;
strcpy(bob.name, lucy.name);

4、结构体在堆区 结构体的指针成员指向堆区。(了解)

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

5、结构体指针数组在堆区、结构体在堆区、结构指针成员在堆区(了解) 

#include <stdio.h>
#include<stdlib.h>
struct stu
{
	int num;
	char *name;//指针成员
};
void test()
{
	struct stu **arr=NULL;
	arr=(struct stu **)calloc(5,sizeof(struct stu *));///给结构体指针数组申请堆区空间
	int i = 0;
	for ( i = 0; i < 5; i++)
	{
		//给指针数组中的每个元素 申请结构体堆区空间
		arr[i] = (struct stu*)calloc(1, sizeof(struct stu));
		//每个结构体中的name成员申请堆区空间
		arr[i]->name = (char*)calloc(1, 100);
		arr[i]->num = 10 + i;
		sprintf(arr[i]->name, "姓名%d", i + 1);
	}
	for ( i = 0; i < 5; i++)
	{
		printf("%d %s\n", arr[i]->num, arr[i]->name);
	}
	//释放
	for ( i = 0; i < 5; i++)
	{
		//先释放结构体中的name的指向
		if (arr[i]->name != NULL)
		{	
			
			free(arr[i]->name);
			arr[i]->name = NULL;
		}
		//释放结构体
		if (arr[i] != NULL)
		{	
			free(arr[i]);
			arr[i] = NULL;	
		}
		//释放整个arr指针数组
		if (arr != NULL)
		{
			free(arr[i]);
			arr= NULL;
		}
	}
}

七、结构体的内存分配对齐规则

1、自动对齐规则

(1)确定分配单位由 结构体中最大的基本类型 长度决定。

(2)确定成员的偏移量

        成员偏移量 = 成员自身类型长度整数倍。倍数由从前往后未被占用的内存空间决定。

(3)结构体的总大小 = 分配单位整数倍

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

 经典案例:画出以下结构体的对齐

struct Data
{
    char a;//成员偏移量 =1B*0
    short b;//成员偏移量 =2B*1
    int c;//成员偏移量 =4B*1
    char d;//成员偏移量 =1B*8
    short e;//成员偏移量 =2B*5
};

最大基本类型为int,分配单位4B,内存分配对齐:

a b b
c c c c
d e e

故总共12B

2、结构体嵌套结构体 自动对齐规则

(1)确定分配单位由 全部结构体中最大的基本类型 长度决定。

(2)确定成员的偏移量

        普通成员偏移量 = 成员自身类型长度整数倍。倍

        被嵌套的结构体整体偏移量 = 该结构体中最大的基本类型整数倍

以上倍数由从前往后未被占用的内存空间决定。

(3)结构体的总大小 = 分配单位整数倍 

   嵌套结构体大小 = 该结构体中最大的基本类型整数倍

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

内存分配情况:共16B

a2
a1
b1 b1 b1 b1
c2 c2

 3、强制对齐

#pragma pack (value)时的指定对齐值value(value值为)

(1)确定分配单位 = min(结构体中最大的基本类型, value)

(2)确定成员的偏移量 成员偏移量 = 成员自身类型的整数倍。

(3)收尾工作 结构体的总大小 = 分配单位整数倍

八、结构体的位域

1、位域的概念

        在结构体中,以为单位的成员,咱们称之为位段(位域)

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

 总共占32位4B

没有非位域隔开且类型相同的位域 叫相邻位域。

相邻位域可以压缩。但是压缩的位数不能超过自身类型的大小。

不能对位域取地址(因:系统分配地址以字节为单位)

 2、防止位溢出

        对位域赋值不能超过位域本身位的宽度 

 【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

3、另起一个存储单元

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

 4、无意义位段

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

 九、共用体union

结构体:所有成员拥有独立空间

共用体:所有成员共享同一块空间

例: 

union Data
{
    char a;
    short b;
    int c;
};

成员a b c共享同一块空间,空间大小由最大的成员空间决定,data为4B。

体现共享:

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

 成员a b c共享同一块空间,但是每个成员 能操作的空间的范围 是由成员自身类型长度决定

 十、枚举

        枚举:将枚举变量 要赋的值 一一列举出来

以扑克花色为例枚举四种花色:

enum POKER_COLOR{HONGTAO,MEIHUA,FANGKUAI,HEITAO};

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习

若修改某个枚举列表的值,从修改处再依次递增。

【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析,C语言,c语言,数据结构,开发语言,学习文章来源地址https://www.toymoban.com/news/detail-591724.html

到了这里,关于【C语言】深入理解C语言数据类型:从结构体到共用体和枚举的全面解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 6. 结构体和自定义类型

    结构体:将相关的数据放置在一起 可以通过点操作符( . )访问内部元素 可以作为函数的输入参数或返回类型 一个简单的代码示例: 编译运行结果: 可以引入成员函数,更好地表示函数与数据的相关性 示例代码:

    2024年01月24日
    浏览(37)
  • 共用体类型--c语言

    共用体类型:         共用体中所有的成员共用一段内存(所有成员的起始地址都是一样的) 格式: 如:  共用体变量的定义         1.先定义类型,在定义变量         2.定义类型的同时,定义变量         3.直接定义变量         注:由于共用体类型的所有成员都

    2024年01月24日
    浏览(31)
  • 【C语言】自定义类型:结构体深入解析(一)

    🔍个人主页 : @啊森要自信的主页 ✏️ 真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝希望看完我的文章对你有小小的帮助,如有错误,可以指出,让我们一起探讨学习交流,一起加油鸭。 本小节,阿森继续和你一起学习什么是

    2024年02月04日
    浏览(42)
  • 深入了解C语言中的结构体类型与内存对齐

    在C语言中,结构体是一种 自定义的数据类型 , 它允许我们将不同类型的数据组合在一起,形成一个新的数据类型 。结构体的使用为我们解决了一些复杂数据的表示和处理问题,不仅限于单单的整型或者字符。本文将深入探讨结构体类型、结构体变量的创建和初始化,并详

    2024年04月11日
    浏览(43)
  • 循环掌控:深入理解C语言循环结构,高效实现重复性任务

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 前面贝蒂带大家了解了选择结构,今天就来为大家介绍 循环结构 ,也就是我们熟悉的 while,do while,还有for 的用法。只要给定的条件为真,C 语言中的

    2024年03月09日
    浏览(37)
  • 【C语言】自定义类型:结构体深入解析(三)结构体实现位段最终篇

    本小节,我们将学习结构体最后的知识:结构体实现位段,阿森将会和你一起去学习什么是位段?位段的内存分配, VS 怎么开辟位段空间呢?位段跨平台问题,随即位段的应用,最后我们也要了解它的注意事项。文章干货满满,很容易理解,学习起来吧!😊 位段是C语言中结

    2024年02月04日
    浏览(35)
  • 【C语言】自定义类型详细讲解(结构体、位段的简单到深入)

    目录 1.结构体的声明 1.1基础知识 1.2结构体的声明 1.3结构体的特殊声明  1.4结构体的自引用 1.5结构体变量的定义和初始化 1.6结构体内存对齐 那对齐这么浪费空间,为什么要对齐  1.7修改默认对齐数 1.8结构体传参 2.位段 2.1什么是位段 2.2位段的内存分配 深入研究VS环境下的位

    2023年04月21日
    浏览(41)
  • 【C语言/C++实现结构体和指针详细教程】

    C语言中的结构体是一种自定义的数据类型,它允许我们将不同类型的数据组合在一起,形成一个新的数据类型。结构体可以包含不同类型的数据,如整数、字符、浮点数、数组等,可以用来描述复杂的数据结构。下面将详细介绍C语言中的结构体,包括结构体的定义、结构体

    2024年02月10日
    浏览(56)
  • 【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参

    本小节,我们学习结构的内存对齐,理解其对齐规则,内存对齐包含结构体的计算,使用宏 offsetof 计算偏移量,为什么要存在内存对齐?最后了解结构体的传参文章干货满满!学习起来吧😃! 结构体内存对齐指的是 结构体中各成员变量在内存中的存储位置按照一定规则对齐

    2024年02月04日
    浏览(47)
  • 深入理解JVM虚拟机第二十七篇:详解JVM当中InvokeDynamic字节码指令,Java是动态类型语言么?

     😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨ 2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群: 583783824   📚📚  工作微信: BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包