C語言 聯合(union)用法案例詳解
聯合(union)的聲明和結構與結構體類似,但是本質不同。
聯合的所有成員引用的是內存中的相同位置。當你想在不同時刻把不同的東西存儲於同一位置時,就可以使用聯合。
構體(struct)中所有變量是“共存”的——優點是“有容乃大”,全面;缺點是struct內存空間的分配是粗放的,不管用不用,全分配。
而聯合體(union)中是各變量是“互斥”的——缺點就是不夠“包容”;但優點是內存使用更為精細靈活,也節省瞭內存空間。
一個簡單程序的分析
#include "stdio.h" union{ int a; float b; char c; }x; int main() { x.c='x'; x.b=3.14; x.a=25; printf("%g \t%c \t %d\t\n",x.b,x.c,x.a); return 0; }
輸出結果為 3.50325e-44 垃圾值 25
可以看出 隻有最後一個x.a=25; 因為x.b會把x.c的地址覆蓋x.a會把x.b的地址覆蓋 所以前兩個打印的都是垃圾值隻有最後一個打印正確。
程序分析2
#include<stdio.h> union var{ long int l; int i; }; main(){ union var v; v.l = 5; printf("v.l is %d\n",v.i); v.i = 6; printf("now v.l is %ld! the address is %p\n",v.l,&v.l); printf("now v.i is %d! the address is %p\n",v.i,&v.i); } //結果: //v.l is 5 //now v.l is 6! the address is 0xbfad1e2c //now v.i is 6! the address is 0xbfad1e2c
程序分析3
#include<stdio.h> union u{ int i; double d;//這個union有8字節大小 }; main(){ union u uu; uu.i = 10; printf("%d\n",uu.i); char * c; c = (char *)&uu;//把union的首地址賦值、強轉成char類型 c[0] = 'a'; c[1] = 'b'; c[2] = 'c'; c[3] = '\0'; c[4] = 'd'; c[5] = 'e'; //最多能到c[7] printf("%s\n",c);//利用結束符'\0'打印字符串"abc" printf("%c %c %c %c %c %c\n",c[0],c[1],c[2],c[3],c[4],c[5]); }
輸出
10
abc
a b c d e
printf("%s\n",c);//利用結束符'\0'打印字符串"abc" 字符串以‘\0'結束所以後面未打印
程序分析4
main() { struct { char name[10]; int age; char job; union { int class; char office[10]; } depa; }body[2]; int n,i; for(i=0;i<2;i++) { printf("input name,age,job and department\n"); scanf("%s %d %c",body[i].name,&body[i].age,&body[i].job); if(body[i].job=='s') scanf("%d",&body[i].depa.class); else scanf("%s",body[i].depa.office); } printf("name\tage job class/office\n"); for(i=0;i<2;i++) { if(body[i].job=='s') printf("%s\t%3d %3c %d\n",body[i].name,body[i].age ,body[i].job,body[i].depa.class); else printf("%s\t%3d %3c %s\n",body[i].name,body[i].age, body[i].job,body[i].depa.office); } }
到此這篇關於C語言 聯合(union)用法案例詳解的文章就介紹到這瞭,更多相關C語言 聯合(union)用法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C語言共用體union作用使用示例教程
- C語言自定義類型詳解(結構體、枚舉、聯合體和位段)
- C語言 structural body結構體詳解用法
- c語言 數據存儲與原碼 反碼 補碼詳細解析
- 一篇文章帶你瞭解C語言–數據的儲存