联合是C语言中的另一种高级数据结构,在编写程序过程中合理的使用共用体,可以节省内存空间,还可以简化多种复杂数据的处理!!
关键字:union
联合也是一种特殊的自定义类型!这种类型定义的变量也包含一系列成员,特征是这些成员公用同一块空间(所以联合也叫共用体)
其中,联合的定义形式如下:
union employee //联合体名 { char name[];//成员列表 int age; char sex; };
与结构体不同,联合的所有成员共享同一块内存,而结构体的每个成员都有自己的内存空间,一个联合类型的字节长度为:占用内存空间最多的成员变量的字节长度!
下面笔者来带领大家测试一下:联合的所有成员共享同一块内存是否成立??
请看笔者代码:
#include <stdio.h> union un { char c; int i; double d; }; int main() { union un un1; printf("&un1 :%p\n", &un1); printf("un1.c :%p\n", &(un1.c)); printf("un1.i :%p\n", &(un1.i)); printf("un1.d :%p\n", &(un1.d)); return 0; }
显而易见,代码的运行结果为:
上面的各个地址都是一样的,说明:联合的所有成员共享同一块内存是成立的!!!
根据联合的最后地址 是一样的这个结果:我们也可以知道:联合体中的成员,不可能同时有,即:在某些时间点上,只有存在1个!!
对于:一个数值,在存储的时候,需要的内存空间只要超过1个字节,就涉及顺序问题:
对于int num=0x11223344;这个在联合体的内存中如何存储??我们来进一步做下探讨:
笔者在之前的文章曾经讲过大小端字节序存储!想要欣赏的各位老铁,可以进行观看一下!!
文章名称为:理解整型在内存中的存储
原文链接为:理解整型在内存中的存储_念君思宁的博客-CSDN博客
大端字节序存储:低位放在高地址,高位放在低地址!!
小端字节序存储:地位放在低地址,高位放在高地址!!
在之前的博客中,笔者就有过涉及:VS中是按照小端字节序存储??还是按照大端字节序存储的博客!!在此,笔者用多种方法来给大家演示一下:
1.
#include <stdio.h> int main() { int num = 1; // 0x00000001 char* p = (char*)# if (*p == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0; }
上述代码中:&num——》int * 类型,强制类型转化为(char *)类型!
代码的运行结果为:
int num=1; //0x00000001
大端字节序存储情况:
小端字节序存储情况:
将上面第一个字节,取出那个地方的地址,强制类型转化为(char *)类型的指针!!在后面对其解引用的时候,访问一个字节!!
其实上面的代码,在调试中,能够更好的观察出来情况!!在此,笔者就不再带领大家进行更多的演示了!
2.
#include <stdio.h> int check_sys() { int num = 1; char* p = (char*)# if (*p == 1) return 1; else return 0; } int main() { int ret = check_sys(); if (ret == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0; }
3
#include <stdio.h> int check_sys() { union un { char c; int i; }u; u.i = 1; return u.c; } int main() { int ret = check_sys(); if (ret == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0; }
上面的三种代码,都是判断大小端的正确代码!!
在联合体的那种写法中:
u.i = 1; u.c; 共用同一块起始地址!!
这次,笔者的大致内容已经讲解完毕,若有其他需要,请欣赏笔者的下一篇关于联合体大小计算的博客,或者私聊笔者,都可以哟!!