C 語言編程 — 高級數據類型 — 共用體

目錄

前文列表

程序編譯流程與 GCC 編譯器
C 語言編程 — 基本語法
C 語言編程 — 基本數據類型
C 語言編程 — 變量與常量
C 語言編程 — 運算符
C 語言編程 — 邏輯控制語句
C 語言編程 — 函數
C 語言編程 — 高級數據類型 — 指針
C 語言編程 — 高級數據類型 — 數組
C 語言編程 — 高級數據類型 — 字符串
C 語言編程 — 高級數據類型 — 枚舉
C 語言編程 — 高級數據類型 — 結構體與位域編程

共用體

共用體是一種特殊的數據類型,容許在相同的內存空間存儲不一樣的數據類型。共用體具備多個成員,但同一時刻只能有一個成員被賦值。共用體提供了一種使用相同的內存空間的有效方式。數組

  • 共用體變量包含的成員都佔用同一塊內存空間。各成員使用同一個起始地址。但在某個瞬間,只能有一個成員生效,即內存空間同一時間只會存放一個成員的數據值。
  • 共用體變量中的一個成員被賦值後,原有變量成員的數據就會被沖掉。若連續爲各個成員進行賦值,那麼只有最後一個被賦值的成員的數據值有效。
  • 共用體變量不能做爲函數參數,函數也不能返回聯合體類型,但指向共用體變量的指針變量能夠做爲函數參數,函數也能夠返回共用體類型指針變量。
定義共用體

使用 union 關鍵字定義共用體類型:ide

union [union tag] {
   member definition;
   member definition;
   ...
   member definition;
} [one or more union variables];
  • union tag 是共用體類型的標識(共用體名稱),爲可選。
  • member definition 是標準的變量定義,好比 int i;
  • 在共用體定義的末尾,能夠指定若干個共用體類型變量,也是可選的。
union Data {
   int i;
   float f;
   char  str[20];
} data;

如今,Data 共用體類型的變量能夠存儲一個整數、或一個浮點數,或一個字符串,這些數值都會存儲在同一個內存空間,但同一時刻只會有一個數值存在,共用體佔用的內存空間爲共用體中最大的成員的空間。能夠根據須要在一個共用體內使用任何內置的或用戶自定義的數據類型。函數

下面的實例顯示共用體佔用的總內存大小:spa

#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 : %lu\n", sizeof(data));
   return 0;
}
訪問共用體成員

依舊是使用成員訪問運算符 .指針

#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\n", data.i);
   printf("data.f : %f\n", data.f);
   printf("data.str : %s\n", data.str);

   return 0;
}

運行:code

$ ./main
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming

上述可見 data.idata.f 的數值被損壞了,這是由於最後賦值的共用體變量成員 str 將 i 和 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\n", data.i);

   data.f = 220.5;
   printf( "data.f : %f\n", data.f);

   strcpy( data.str, "C Programming");
   printf( "data.str : %s\n", data.str);

   return 0;
}

運行:編譯器

$ ./main
data.i : 10
data.f : 220.500000
data.str : C Programming
相關文章
相關標籤/搜索