上一篇文章:动态数组的实现,结合指针与结构体实现链表,以及链表相关操作
共用体
共用体可以将不同数据类型的值放在同一个内存空间中,现实在一个存储区根据程序执行的不同需求读写不同类型的数据。
共用体类型的定义
union 共用体类型名{
成员列表;
};
共用体变量的定义 三种不同的形式定义共用体变量: (一)先定义共用体类型,再定义该类型的变量,格式union 共用体类型名 共用体变量;
union uni {
int a;
double b;
};
union uni u1, u2, u3;
(二)共用体类型和该共用体类型的变量同时定义
union uni {
int a;
double b;
}u1, u2, u3;
(三)同时定义,但省略共用体类型的名字
union {
int a;
double b;
}u1, u2, u3;
共用体变量的引用 和结构体变量的引用一样,通过点. 来引用其成员变量。
#include <stdio.h>
union un {
int a;
float b;
};
int main(){
union un a;
a.a = 666;
a.b = 3.14;
printf("%f\n",a.b);
return 0;
}
运行结果为:
共用体的特点
- 所有成员共用一块内存空间,其首地址相同。共用体变量与其各成员变量的内存地址相同。共用体变量所占内存大小为成员当中占内存最大的那个变量的大小。
#include <stdio.h>
typedef union un {
int a;
float b;
double c;
}UN;
int main(){
UN a;
printf("%d",sizeof(UN));
return 0;
}
运行结果为:8,既8个字节,也就是成员当中占内存最大的double类型的大小。
- 不能对共用体变量进行初始化,也不能将共用体变量作为函数的参数,以及不能使函数返回一个共用数据,但可以使用指向共用体变量的指针。
- 共用体当中可以有结构体,结构体当中也可以共用体。
学生成绩分级 处理一个学生的成绩,可以是百分制的,也可以是A~E六个等级
#include <stdio.h>
union score{
int cj;
char dj;
};
typedef struct student{
int no;
char name[10];
union score sco;
}STU;
int main(){
STU s;
int opt;
printf("Please input no, name\n");
scanf("%d%s",&s.no, s.name);
printf("Please select:\nOption 1:0~100 score\nOption 2:A~E score\n");
scanf("%d",&opt);
if(opt == 1){
printf("input score:(0~100)\n");
scanf("%d",&s.sco.cj);
printf("The data is:\n");
printf("%d %s %d \n",s.no, s.name, s.sco.cj);
}
else if(opt == 2){
printf("please input score (A~E)\n");
getchar();
scanf("%c",&s.sco.dj);
printf("The data is:\n");
printf("%d %s %c \n",s.no, s.name, s.sco.dj);
}
return 0;
}
运行:
查看长整型数据的高、低位
#include <stdio.h>
union un {
long a;
struct {
unsigned short low;
unsigned short high;
}b;
};
int main(){
union un u;
long x;
scanf("%ld",&x);
u.a = x;
printf("High: %d low: %d\n",u.b.high, u.b.low);
return 0;
}
运行: 高、低位要分别转换成二进制才能看出来。上面的代码是分别将高位和低位二进制数转换成十进制数后再输出。
|