程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 學點C語言(28):數據類型 - 聯合(union)

學點C語言(28):數據類型 - 聯合(union)

編輯:關於C語言

在結構中, 每個字段的數據類型是唯一的; 使用聯合可以在一個字段中儲存不同的數據類型.

不同的數據類型共享一塊內存. 當然其內存大小應依著大的來.

聯合中的數據, 非此即彼, 只有一個有效; 應該有說明在某個數據中此時有用的是什麼類型.

除了共享內存以外, 聯合與結構一樣.

1. union 的大小是其中最大數據成員的大小:

#include <stdio.h>

int main(void)
{
  union MyUnion {
    short n1;
    int  n2;
    double n3;
  };

  printf("%u, %u\n", sizeof(union MyUnion), sizeof(double));

  getchar();
  return 0;
}

2. union 的特點是共享內存, 修改一個其他都會變:

#include <stdio.h>
#include <limits.h>

int main(void)
{
  union MyUnion {
    unsigned char   n1;
    unsigned short  n2;
    unsigned int   n3; 
  } U = {0};

  printf("%10u, %10u, %10u\n", U.n1, U.n2, U.n3);

  U.n2 = USHRT_MAX;
  printf("%10u, %10u, %10u\n", U.n1, U.n2, U.n3);

  U.n3 = INT_MAX;
  printf("%10u, %10u, %10u\n", U.n1, U.n2, U.n3);

  U.n1 = 0;
  printf("%10u, %10u, %10u\n", U.n1, U.n2, U.n3);

  getchar();
  return 0;
}

3. 在結構中使用聯合:

#include <stdio.h>

int main(void)
{
  enum UnionTyte{SHORT, INT, FLOAT};

  struct Rec {
    unsigned ID;
    enum UnionTyte type; /* 識別字段 */
    union {       /* 聯合 */
      short s;
      int  i;
      float f;
    } u;
  } R[4];

  size_t i;

  R[0].ID = 1;
  R[0].type = SHORT;
  R[0].u.s = 123;

  R[1].ID = 2;
  R[1].type = INT;
  R[1].u.i = 12345;

  R[2].ID = 3;
  R[2].type = FLOAT;
  R[2].u.f = 3.14;

  R[3].ID = 4;
  R[3].type = INT;
  R[3].u.i = 54321;

  for (i = 0; i < sizeof R / sizeof R[0]; i++) {
    switch (R[i].type) {
      case SHORT : printf("%u: %hd\n", R[i].ID, R[i].u.s); break;
      case INT  : printf("%u: %d\n", R[i].ID, R[i].u.i); break;
      case FLOAT : printf("%u: %g\n", R[i].ID, R[i].u.f); break;
    }
  }

  getchar();
  return 0;
}

返回“學點C語言 - 目錄”

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved