C語言中union與struct的區別

來源:互聯網
上載者:User

    在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了。


另外簡單說一下結構體和類的區別:

個人認為唯一是存取權限的不同,結構體預設的存取權限是公有的,而類的預設存取權限是私人的。

歡迎各位批評斧正!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.