亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C語言編程中的聯合體union入門學習教程

2020-05-23 14:11:47
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C語言編程中的聯合體union入門學習教程,也是C語言入門學習中的基礎知識,需要的朋友可以參考下
 

聯合體(union)在C語言中是一個特殊的數據類型,能夠存儲不同類型的數據在同一個內存位置??梢远x一個聯合體使用許多成員,但只有一個部件可以包含在任何時候給定的值。聯合體會提供使用相同的存儲器位置供多用途的有效方式。

定義聯合體
要定義聯合體,必須使用union語句很相似于定義結構。聯合體聲明中定義了一個新的數據類型,程序不止一個成員。聯合體聲明的格式如下:

union [union tag]{  member definition;  member definition;  ...  member definition;} [one or more union variables]; 

union標簽是可選的,每個成員的定義是一個正常的變量定義,如 int i; 和 float f; 或任何其他有效的變量的定義。在聯合體定義的結尾,最后分號之前,可以指定一個或多個變量的聯合,但它是可選的。這里定義一個名為數據聯合類型有三個成員 i, f, 和 str:

union Data{  int i;  float f;  char str[20];} data; 

現在,數據類型的變量可以存儲的整數,一個浮點數,或字符的字符串。這意味著一個單可變結構即相同的存儲單元可用于存儲多個類型的數據。可以使用任何內置或用戶定義的數據類型根據需要在聯合里面。

通過union所占用的內存將大到足以容納聯合體的最大成員。例如,在上面的例子中的數據類型將占用20個字節的存儲空間,因為這是通過文字串所占用的最大空間。以下將顯示由上述聯合共占用內存大小的例子:

#include <stdio.h>#include <string.h> union Data{  int i;  float f;  char str[20];}; int main( ){  union Data data;      printf( "Memory size occupied by data : %d", sizeof(data));  return 0;}

讓我們編譯和運行上面的程序,這將產生以下結果:

Memory size occupied by data : 20

訪問聯合體成員
要訪問聯合體的任何成員,我們使用成員訪問運算符(.)。成員訪問運算符編碼為聯合體變量名和成員,訪問時使用union關鍵字定義聯合體類型的變量。以下為例子來解釋聯合體的用法:

#include <stdio.h>#include <string.h> union Data{  int i;  float f;  char str[20];}; int main( ){  union Data data;      data.i = 10;  data.f = 220.5;  strcpy( data.str, "C Programming");  printf( "data.i : %d", data.i);  printf( "data.f : %f", data.f);  printf( "data.str : %s", data.str);  return 0;}

讓我們編譯和運行上面的程序,這將產生以下結果:

data.i : 1917853763data.f : 4122360580327794860452759994368.000000data.str : C Programming

在這里,我們可以看到,聯合體成員i 和f 值被損壞,因為分配給變量終值已占用的內存位置,如果str成員的值被很好的打印的原因?,F在,讓我們來再一次看看同樣的例子,我們將使用一個變量在同一時間,它是聯合體的主要目的:

#include <stdio.h>#include <string.h> union Data{  int i;  float f;  char str[20];}; int main( ){  union Data data;      data.i = 10;  printf( "data.i : %d", data.i);    data.f = 220.5;  printf( "data.f : %f", data.f);    strcpy( data.str, "C Programming");  printf( "data.str : %s", data.str);  return 0;}

讓我們編譯和運行上面的程序,這將產生以下結果:

data.i : 10data.f : 220.500000data.str : C Programming

這里,所有的成員都得到打印得非常好,因為一個部件被一次使用。

應用場合
當多個數據需要共享內存或者多個數據每次只取其一時,可以利用聯合體(union)。在C Programming Language 一書中對于聯合體是這么描述的:

     1)聯合體是一個結構;

     2)它的所有成員相對于基地址的偏移量都為0;

     3)此結構空間要大到足夠容納最"寬"的成員;

     4)其對齊方式要適合其中所有的成員;

下面解釋這四條描述:

     由于聯合體中的所有成員是共享一段內存的,因此每個成員的存放首地址相對于于聯合體變量的基地址的偏移量為0,即所有成員的首地址都是一樣的。為了使得所有成員能夠共享一段內存,因此該空間必須足夠容納這些成員中最寬的成員。對于這句“對齊方式要適合其中所有的成員”是指其必須符合所有成員的自身對齊方式。

下面舉例說明:

如聯合體

union U{  char s[9];  int n;  double d;};

s占9字節,n占4字節,d占8字節,因此其至少需9字節的空間。然而其實際大小并不是9,用運算符sizeof測試其大小為16.這是因為這里存在字節對齊的問題,9既不能被4整除,也不能被8整除。因此補充字節到16,這樣就符合所有成員的自身對齊了。從這里可以看出聯合體所占的空間不僅取決于最寬成員,還跟所有成員有關系,即其大小必須滿足兩個條件:1)大小足夠容納最寬的成員;2)大小能被其包含的所有基本數據類型的大小所整除。

測試程序:

/*測試聯合體 2011.10.3*/#include <iostream>using namespace std;union U1{  char s[9];  int n;  double d;};union U2{  char s[5];  int n;  double d;};int main(int argc, char *argv[]){  U1 u1;  U2 u2;  printf("%d/n",sizeof(u1));  printf("%d/n",sizeof(u2));  printf("0x%x/n",&u1);  printf("0x%x/n",&u1.s);  printf("0x%x/n",&u1.n);  printf("0x%x/n",&u1.d);  u1.n=1;  printf("%d/n",u1.s[0]);  printf("%lf/n",u1.d);  unsigned char *p=(unsigned char *)&u1;  printf("%d/n",*p);  printf("%d/n",*(p+1));  printf("%d/n",*(p+2));  printf("%d/n",*(p+3));  printf("%d/n",*(p+4));  printf("%d/n",*(p+5));  printf("%d/n",*(p+6));  printf("%d/n",*(p+7));  return 0;}

輸出結果為:

1680x22ff600x22ff600x22ff600x22ff6010.000000100048204640請按任意鍵繼續. . .

對于sizeof(u1)=16。因為u1中s占9字節,n占4字節,d占8字節,因此至少需要9字節。其包含的基本數據類型為char,int,double分別占1,4,8字節,為了使u1所占空間的大小能被1,4,8整除,則需填充字節以到16,因此sizeof(u1)=16.

對于sizeof(u2)=8。因為u2中s占5字節,n占4字節,d占8字節,因此至少需要8字節。其包含的基本數據類型為char,int,double分別占1,4,8字節,為了使u2所占空間的大小能被1,4,8整除,不需填充字節,因為8本身就能滿足要求。因此sizeof(u2)=8。

從打印出的每個成員的基地址可以看出,聯合體中每個成員的基地址都相同,等于聯合體變量的首地址。

對u1.n=1,將u1的n賦值為1后,則該段內存的前4個字節存儲的數據為00000001 00000000 00000000 00000000

因此取s[0]的數據表示取第一個單元的數據,其整型值為1,所以打印出的結果為1.

至于打印出的d為0.000000愿意如下。由于已知該段內存前4字節的單元存儲的數據為00000001 00000000 00000000 00000000,從上面打印結果48,204,64,0可以知道后面4個字節單元中的數據為00110000 11001100 01000000 00000000,因此其表示的二進 制浮點數為

00000000 01000000 11001100 00110000 00000000 00000000 00000000 00000001

對于double型數據,第63位0為符號位,62-52 00000000100為階碼,0000 11001100 00110000 00000000 00000000 00000000 00000001為尾數,根據其值知道尾數值約為0,而階碼為4-1023=-1019,因此其表示的浮點數為1.0*2^(-1019)=0.00000000000......,因此輸出結果為0.000000。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久亚洲精品中文字幕| 青草青草久热精品视频在线观看| 人人爽久久涩噜噜噜网站| 亚洲欧美日本伦理| 欧美精品做受xxx性少妇| 国产一区二区三区中文| 欧美亚洲国产视频小说| 俺去亚洲欧洲欧美日韩| 亚洲视频在线视频| 91精品国产一区| 欧美孕妇毛茸茸xxxx| 国产激情999| 欧美丰满少妇xxxxx| 国产日韩欧美一二三区| 免费97视频在线精品国自产拍| 亚洲国语精品自产拍在线观看| 欧美亚洲成人网| 国产情人节一区| 久久精品国产视频| 92看片淫黄大片看国产片| 欧美电影电视剧在线观看| 国产一区二区三区毛片| 97色在线观看免费视频| 久久成人精品视频| 成人www视频在线观看| 亚洲欧美三级在线| 亚洲人成网站777色婷婷| 国产精品久久一区主播| 国产成人精品久久亚洲高清不卡| 亚洲老司机av| 亚洲美女视频网| 国产91|九色| 国产成人精品最新| 欧美亚洲国产另类| 久久久亚洲国产天美传媒修理工| 日韩av免费在线播放| 欧美极品美女视频网站在线观看免费| 亚洲天堂av综合网| 精品国产依人香蕉在线精品| 久久久久久久电影一区| 欧美另类精品xxxx孕妇| 美女精品久久久| 久久精品国产欧美亚洲人人爽| 欧美大码xxxx| 日韩在线视频国产| 欧美午夜丰满在线18影院| 久久久亚洲影院| 永久555www成人免费| 国产va免费精品高清在线观看| 亚洲欧美日韩在线一区| 欧美成人免费播放| 亚洲成色777777在线观看影院| 亚洲视频网站在线观看| xxx成人少妇69| 一区二区av在线| 亚洲91精品在线观看| 欧美电影院免费观看| 亚洲女人天堂成人av在线| 亚洲网站视频福利| 亚洲一区二区精品| 日韩中文字幕不卡视频| 国产精品久久一区主播| 中文字幕亚洲欧美一区二区三区| 97视频人免费观看| 日韩免费黄色av| 久久久精品国产一区二区| 日韩欧美在线一区| 亚洲影院在线看| 亚洲国产精品999| 国产午夜精品视频免费不卡69堂| 国产拍精品一二三| 国内精品久久久久| 亚洲精品国产精品国自产观看浪潮| 精品视频—区二区三区免费| 麻豆一区二区在线观看| 精品亚洲aⅴ在线观看| 欧美有码在线观看| 日韩经典中文字幕在线观看| 欧美色视频日本高清在线观看| 国产日韩欧美91| 欧美精品成人91久久久久久久| 国产成人精品综合久久久| 亚洲欧洲国产一区| 欧美日韩日本国产| 亚洲精品v天堂中文字幕| 国产精品第七影院| 成人伊人精品色xxxx视频| 91成人在线视频| 欧美国产乱视频| 在线观看日韩视频| 欧美专区中文字幕| 成年人精品视频| 在线一区二区日韩| 日韩激情av在线免费观看| 亚洲黄色成人网| 日韩中文在线观看| 精品久久香蕉国产线看观看gif| 国产成人亚洲综合青青| 日韩久久免费视频| 国产精品免费视频久久久| 国产深夜精品福利| 国产精品偷伦视频免费观看国产| 日韩美女写真福利在线观看| 亚洲欧美中文日韩在线v日本| 97国产精品视频人人做人人爱| 国产一区二区三区在线免费观看| 精品夜色国产国偷在线| 亚洲已满18点击进入在线看片| 国产精品久久久久久久久男| 亚洲大胆人体av| 亚洲va男人天堂| 欧美性生交大片免费| 欧美在线激情网| 一本一本久久a久久精品牛牛影视| 亚洲男人天堂2023| 日韩视频欧美视频| 九九热在线精品视频| 黑人狂躁日本妞一区二区三区| 亚洲女人被黑人巨大进入| 精品露脸国产偷人在视频| 欧洲成人免费视频| 中文字幕自拍vr一区二区三区| 亚洲永久在线观看| 国产精品青青在线观看爽香蕉| 日韩精品福利网站| 精品国产乱码久久久久久虫虫漫画| 久久视频精品在线| 欧美日韩电影在线观看| 欧美劲爆第一页| 国产精品va在线播放我和闺蜜| 在线午夜精品自拍| 91高潮精品免费porn| 国产精品久久久久久亚洲调教| 亚洲性生活视频| 久久久久久国产精品美女| 国产精品99久久久久久久久| 蜜月aⅴ免费一区二区三区| 色偷偷88888欧美精品久久久| 日韩电影在线观看永久视频免费网站| 国产亚洲欧美一区| 国产精品欧美激情| 国产mv免费观看入口亚洲| 成人性生交大片免费看小说| 日韩欧美精品网站| 久久久久久一区二区三区| 欧美一级淫片aaaaaaa视频| 欧美最近摘花xxxx摘花| 国产精品综合不卡av| 亚洲毛片在线观看.| 国产丝袜高跟一区| 日韩在线观看av| 亚洲乱码国产乱码精品精天堂| 91av在线影院| 亚洲欧美国产一本综合首页| 亚洲欧美日韩中文在线制服| 亚洲午夜av电影| 国产精品99久久久久久久久| 在线视频国产日韩| 丝袜一区二区三区| 亚洲国产毛片完整版| 亚洲а∨天堂久久精品9966| 久久夜色精品国产欧美乱| 精品久久久久久久久久久久久久| 国产精品精品视频一区二区三区|