在C語言中結構體和聯合具有細微差別,特別是使用sizeof()對其求大小時,許多剛剛接觸C語言不久的朋友對此非常困惑,下面我將簡單談以下自己對union與struct之間的區別
聯 合(union)
1. 聯合說明和聯合變數定義
聯合也是一種新的資料類型, 它是一種特殊形式的變數。
聯合說明和聯合變數定義與結構十分相似。其形式為:
union 聯合名{
資料類型 成員名;
資料類型 成員名;
...
} 聯合變數名;
聯合表示幾個變數公用一個記憶體位置, 在不同的時間儲存不同的資料類型 和不同長度的變數。
union A
{
int a[5];
char b;
double c;
}Air;
表示聲明了一個名稱為A的聯合,可以使用A variable 來定義聯合變數。
在聯合變數 variable中 整型和字元型以及double型公用同一記憶體位置。
當一個聯合被說明時, 編譯器自動地產生一個變數, 其長度為聯合中最大的變數長度。
聯合訪問其成員的方法與結構相同。同樣聯合變數也可以定義成數組或指標,但定義為指標時, 也要用"->"符號, 此時聯合訪問成員可表示成:
聯合名->成員名
另外, 聯合既可以出現在結構內, 它的成員也可以是結構。
union
{
int i;
struct
{
char first;
char second;
}half;
}number;
2.結構的定義
定義一個結構的一般形式為:
struct 結構名
{
成員表列
};
成員表由若干個成員組成, 每個成員都是該結構的一個組成部分。對每個成員也必須作類型說明,其形式為:
類型說明符 成員名;
成員名的命名應符合標識符的書寫規定。例如:
struct stu
{
int num;
char name[20];
char sex;
float score;
};
在這個結構定義中,結構名為stu,該結構由4個成員組成。第一個成員為num,整型變數;第二個成員為name,字元數組;第三個成員為 sex,字元變數;第四個成員為score,實型變數。 應注意在括弧後的分號是不可少的。結構定義之後,即可進行變數說明。 凡說明為結構stu的變數都由上述4個成員組成。由此可見, 結構是一種複雜的資料類型,是數目固定,類型不同的若干有序變數的集合。
在介紹了結構和聯合得基本知識後,我們開始今天要講的關於sizeof對結構體和聯合求值問題:
讓我們來看一道華為的面試題:
例:設有以下說明和定義:
typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
則語句 printf( "%d",sizeof(struct date)+sizeof(max));的執行結果是:____
需要說明的是typedef只是一個簡單的名字替換,方便系統在不同的平台上移植,請參考以下例子:
/*
Name: typedef
Copyright: reserved
Author: persever
Date: 02-08-11 03:51
Description:
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
typedef int Example;
Example a=10;//Equals to int a=10;
printf("%d\n",a);
system("pause");
}
解釋:假設為32位機器,那麼DATE是一個union, 變數公用空間. 裡面最大的變數類型是int[5], 佔用20個位元組. 所以它的大小是20,data是一個struct, 每個變數分開佔用空間. 依次為int4 + DATE20 + double8
= 32. 所以結果是 20 + 32 = 52.
再看下例:
設有以下說明和定義:
typedef union {double i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
則語句 printf( "%d",sizeof(struct date)+sizeof(max));的執行結果是:____
在草率回答這一問題之前我們先看一個小例子:
#include <stdio.h>
#include <stdlib.h>
union A
{
int a[5];
char b;
double c;
};
int main()
{
printf("%d\n",sizeof(A));
system("pause");
}
對A用sizeof輸出卻得到的是24!union中變數共用記憶體,應以最長的為準,可是結果卻不是我們預想的20,這是因為在聯合內變數的預設記憶體對其方式,必須以最長的double8位元組對齊,也就是說故應該是sizeof(A)=24;所以我們將聯合中的int a[5] 修改成 int a[6] 結果仍然不變,但如果我們將int
a[5]修改成 int a[7],結果就變成了 32了。
另外簡單說一下結構體和類的區別:
個人認為唯一是存取權限的不同,結構體預設的存取權限是公有的,而類的預設存取權限是私人的。
歡迎各位批評斧正!