大家好,欢迎来到IT知识分享网。
目录
1.2.1 同一个内存段可以用来存放几种不同类型的成员,但在每一个瞬时只能存放其中一个成员,而不是同时存放几个。也就是说,在共用体变量中只能存放一个值。
1.2.2 可以对共用体变量初始化,但初始化表中只能有一个常量。
1.2.3 共用体变量中起作用的成员是最后一次被赋值的成员。在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就被取代。
1.2.5 不能对共用体变量名赋值,也不能引用变量名来得到一个值。
1.2.6 共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的变量。
一、学习C语言的共用体
共用体也被称为联合体,类型定义的变量包含一系列的成员,特征是这些成员共用同一块空间。即同一段内存单元里面存放着不同类型的变量。
定义共同体类型变量的一般形式:
或
或
程序举例:(程序中四种方法均正确。运行程序时,择其一种方法,主函数部分不用改动。)
//联合体变量的定义方法 #include <stdio.h> 方法一:先创建模板,再定义变量 //union xin{ // 创建联合体模板 union xin // int i; // char j; //}; //union xin a,b; // 使用该联合体模板创建两个变量 a, b 方法二:同时创建模板和变量 //union xin{ // 创建联合体模板 union xin 的同时定义两个变量a,b // int i; // char j; //}a,b; 方法三:省略联合体名 //union{ // int i; // char j; //}a,b; //方法四:使用typedef typedef union xin{ // 联合体模板 union xin重新命名为 X int i; char j; }X; X a,b; // 使用新名字 X,创建两个变量 a, b int main() //主函数 { a.i = 5; b.j = 'k' ; printf("%d %c",a.i,b.j); return 0; }
运行结果:
1.1 引用共用体的方式
例如上述程序中的:
a.i (引用共用体变量中的整型变量 i)
b.j (引用共用体变量中的字符变量 j)
1.2 共用体类型数据的特点
1.2.1 同一个内存段可以用来存放几种不同类型的成员,但在每一个瞬时只能存放其中一个成员,而不是同时存放几个。也就是说,在共用体变量中只能存放一个值。
#include <stdio.h> union XIN{ char j; int i; }xin; //定义共用体数据变量 int main() //主函数 { xin.i = 97; printf("%d\n",xin.i); printf("%c",xin.j); //根据ASCLL码表转换 97对应'a' return 0; }
运行结果:
1.2.2 可以对共用体变量初始化,但初始化表中只能有一个常量。
#include <stdio.h> union XIN{ int i; char j; }a,b; //定义共用体数据变量 int main() //主函数 { union XIN a = {16}; //对第一个成员初始化 union XIN b = {.j='h'}; //指定一个成员初始化 printf("%d\n",a.i); printf("%c",b.j); return 0; }
运行结果:
1.2.3 共用体变量中起作用的成员是最后一次被赋值的成员。在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就被取代。
程序举例:
#include <stdio.h> union XIN{ int i; char j; float k; }a; //定义共用体数据变量 int main() //主函数 { a.j = 'a'; a.k = 1.5; a.i = 40; //在完成以上三个赋值运算后,变量存储单位存放的值是 40。 printf("%d\n",a.i); //输出整数 40 printf("%c",a.j); //根据ASCLL码表上,40对应的字符是"(" return 0; }
运行结果:
1.2.4 共用体变量的地址和它的各成员的地址一样的。
例如:a为共用体变量,则 &a.i,&a.j,&a.k 都是同一个值。
1.2.5 不能对共用体变量名赋值,也不能引用变量名来得到一个值。
例如:a为共用体变量,则 a=1,m=a都是错的。
1.2.6 共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的变量。
程序举例:
#include <stdio.h> struct{ //声明无名结构体类型 int num; //成员(编号) char name[15]; //成员(姓名) char gender[10]; //成员(性别) char job[10]; //成员(职业) union{ //声明无名联合体类型 int bj; //成员(班级) char zw[20]; //成员(职务) }xin; //xin是共用体变量 }person[3]; //定义结构体数组 person,有三个元素 int main(){ int i; for(i=0;i<3;i++){ printf("请依次输入信息:编号、姓名、性别、职业\n"); scanf("%d %s %s %s",&person[i].num,&person[i].name,&person[i].gender,&person[i].job); //输入前四项 if(strcmp(person[i].job,"学生")==0){ //运用strcmp函数,比较字符串 printf("请输入班级号:\n"); scanf("%d",&person[i].xin.bj); } else{ printf("请输入职务:\n"); scanf("%s",&person[i].xin.zw); } } printf("\n"); printf("No.\t name\t sex\t job\t bj/zw\n"); for(i=0;i<3;i++){ if(strcmp(person[i].job,"学生")==0){ //运用strcmp函数,比较字符串 printf("%d\t %s\t %s\t %s\t %d\n",person[i].num,person[i].name,person[i].gender,person[i].job,person[i].xin.bj); } else{ printf("%d\t %s\t %s\t %s\t %s\n",person[i].num,person[i].name,person[i].gender,person[i].job,person[i].xin.zw); } } return 0; }
运行结果:
1.3 联合体内存存储的大小
联合体的大小至少是最大成员的大小,当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
1.3.1 各基本类型在联合体内存存储的大小
程序举例:
#include<stdio.h> union xin1{ char c[5]; // 1个 char类型占 1字节,5个占 5字节 int i; // int 占 4字节 }; union xin2{ short c[7]; // 1个 short类型占 2字节,7个占 14字节 int i; // int 占 4字节 }; union xin3{ float c[7]; // 1个 float类型占 4字节,7个占 28字节 double i; // double 占 8字节 }; union xin4{ double c[7]; // 1个 double类型占 8字节,7个占 56字节 float i; // float 占 4字节 }; //联合体的大小为单个成员最大值的倍数,且刚好大等于同类型成员的总值 int main() { printf("union xin1的大小:%d\n", sizeof(union xin1)); // 8 2*4 > 5 printf("union xin2的大小:%d\n", sizeof(union xin2)); // 16 4*4 > 14 printf("union xin3的大小:%d\n", sizeof(union xin3)); // 32 8*4 > 28 printf("union xin4的大小:%d\n", sizeof(union xin4)); // 56 8*7 >= 56 return 0; }
运行结果:
1.3.2 联合体判断内存存储是大端存储还是小端存储的优势
程序举例:
#include <stdio.h> union XIN{ char i; int j; }xin; //联合体变量创建方法类比结构体 int main() { xin.i = 1; //0x 00 00 00 01 低地址-------->高地址 if (xin.j == 1){ //01 00 00 00 小端存储 低位放低地址 printf("小端"); } else{ //00 00 00 01 大端存储 低位放高地址 printf("大端"); } return 0; }
运行结果:
二、使用枚举类型
如果一个变量只有几种可能的值,则可以定义为枚举类型。所谓”枚举”,就是指把可能的值都列举出来,变量的值只限于列举出来的值的范围内。
声明枚举类型的一般形式:
注意:
- C编译对枚举类型的枚举元素按常量处理,故称枚举常量(也称为枚举元素),不能对枚举元素赋值。
- 每一个枚举元素都代表一个整数,C语言编译按定义时的顺序默认从0开始依次往后递加1赋值。当然,也可以人为地指定枚举元素的数值,在定义枚举类型是显式地指定;未指定的枚举元素按照默认顺序往后赋值,数值大小以人为赋值的大小往后递加1开始赋值。
- 可以将枚举元素的数值赋值给其他变量。
- 枚举元素可以用来作判断比较。
2.1 枚举类型的简单使用
程序举例: (结合上述的注意点)
#include<stdio.h> int main(){ enum WEekday{sun,mon,tue,wed,thu,fri,sat}; //声明枚举类型 enum WEekday enum Sum{a=9,b=2,c,d,e,f,g}; //人为地指定枚举元素的数值 enum WEekday workday,weekday; //定义枚举变量 int i,j; i=sun; //将枚举元素的数值赋值给其他变量 printf("sun的数值为:%d\n",i); i=a; //重新给变量 i赋值 j=c; printf("a的数值为:%d \nc的数值为:%d\n",i,j); if(c==mon){ //枚举元素作判断比较 printf("c和mon的数值相同,均为:%d\n",mon); } else{ printf("c和mon的数值不同,c为:%d\t mon为:%d",c,mon); } return 0; }
运行结果:
2.2 枚举类型的复杂使用
问题:口袋中有红、黄、蓝、白、黑五种颜色的球若干个,每次从口袋中先后取出三个球,问得到三种不同颜色的球的可能取法,输出每种排列的情况。
程序举例:
#include <stdio.h> int main() { enum Color {red,yellow,blue,white,black}; //声明枚举类型 enum Color enum Color i,j,k,pri; //定义枚举变量 int n,loop; n=0; printf(" "); for(i=red;i<=black;i++){ //外循环改变 i的值 for(j=red;j<=black;j++){ //中循环改变 j的值 if (i!=j){ //如果 i和j两个球颜色不同 for(k=red;k<=black;k++){ //内循环改变 k的值 if((k!=i)&&(k!=j)){ //如果i、j、k三个球颜色不同 n=n+1; //符合条件次数 +1 printf("%-4d",n); for(loop=1;loop<=3;loop++){ switch(loop){ //运用 switch - case - default结构 case 1: pri=i;break; // loop值为 1时,把第 1个球的颜色赋给 pri case 2: pri=j;break; // loop值为 2时,把第 2个球的颜色赋给 pri case 3: pri=k;break; default: break; } switch(pri){ //运用 switch - case - default结构 case red: printf("%-10s","red");break; case yellow: printf("%-10s","yellow");break; // pri的值与枚举常量 yellow的数值相同时,输出"yellow" case blue: printf("%-10s","blue");break; // pri的值与枚举常量 blue的数值相同时,输出"blue" case white: printf("%-10s","white");break; case black: printf("%-10s","black");break; default: break; } } printf("\t "); } } } } } printf("\n一共有%d种排列方法",n); return 0; }
运行结果:
觉得有帮助的话,能给个小心心吗?
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/130099.html