當前位置:首頁 » 編程語言 » 聯合體c語言

聯合體c語言

發布時間: 2022-04-20 03:26:30

c語言中聯合體(union)的使用

uniuon data{ int i ; char c ;float f;}x;
定義了一個結合體名叫x 裡麵包含了int型變數i,char類型c,float類型變數f
int y;這是聲明的一個變數

⑵ C語言聯合體存儲方法

這個和體系結構有關。首先int行具體是1個位元組還是2個位元組是不確定的。早期的編譯器來說。int是一位元組。但是現在的都是2位元組。因為計算機處理器一般都是32位處理器。
聯合只取最大的空間。比如。你定義的聯合體。int
A,char
B[2],其實在計算機裡面只佔用了2個位元組。你存儲char時,全佔了。當你存儲為int類型時候。要麼佔用一半的空間。要麼全部都佔用了。這個和計算機體系結構有關。但是a和b是不會同時存在的。聯合中的成員同時只能有一個。這個是和結構體區別的地方。如果還有疑問建議你去看看書吧。這個是基礎知識。

⑶ C語言裡面的聯合體和結構體有什麼區別,分別是什麼含義感覺都是一樣的,都是類的不同特性

聯合體與結構體是很容易混淆的概念。粗略一看,兩者無論聲明、定義還是定義對象的方式都很相似。然而這兩個東西的概念和作用實際千差萬別。
首先,聯合體的各個成員共用內存,並應該同時只能有一個成員得到這塊內存的使用權(即對內存的讀寫),而結構體各個成員各自擁有內存,各自使用互不幹涉。所以,某種意義上來說,聯合體比結構體節約內存。
舉個例子:
typedef struct
{
int i;
int j;
}A;
typedef union
{
int i;
double j;
}U;
sizeof(A)的值是8,sizeof(U)的值也是8(不是12)。
為什麼sizeof(U)不是12呢?因為union中各成員共用內存,i和j的內存是同一塊。而且整體內存大小以最大內存的成員的劃分。即U的內存大小是double的大小,為8了。sizeof(A)大小為8,因為struct中i和j各自得到了一塊內存,每人4個位元組,加起來就是8了。
了解了聯合體共用內存的概念,也就是明白了為何每次只能對其一個成員賦值了,因為如果對另一個賦值,會覆蓋了上一個成員的值。

⑷ C語言里,聯合體要不要像結構體一樣對齊如果要,是幾的倍數

也要對齊。首先,聯合體要能容納其中最大的元素;然後,聯合體的對齊位元組數要跟內部元素的最大對齊位元組數一致。
例如,聯合體中含有以下幾個元素:
union
example
{
char
a;
int
b;
double
c;
struct
d
{
int
x;
int
y;
int
z;
};
};
1.
聯合體要能容納struct
d,因為d是12位元組,所以聯合體的大小要大於等於12。
2.
聯合體的對齊要以double
c為准,因為c是8位元組對齊的,最長。
所以最終,聯合體的大小是16個位元組。

⑸ 關於c語言中聯合體/共用體中數據存放的問題

你好!!!
首先我們了解聯合體的所有成員是在內存中共享一塊內存的,在某一時刻只能有一個成員使用這個內存!!!
我們來看看一個例子:
#include <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266
解釋如下:
union
{
int i;
char x[2];
}a;
在聯合體a中定義了兩種數據類型,字元數組x以及整形變數i.其中整形變數是16位的,數組大小為2的字元數組為8X2=16位。如此一來,編譯器便會為聯合體a在內存中開辟一個16位的空間,這個空間里存儲聯合體的數據,但是這個空間只有16位,它既是整形變數的數據,也是字元數組的數據。如果你的程序從字元數組的角度解析這個空間,那麼它就是兩個字元,如果你的程序從整型的角度解析這個空間,那麼它就是一個整數。
以你的程序為例子,現在已經開辟了一個16位的空間,然後我們假定現在空間還沒有被賦值,為:
00000000 00000000
那麼在運行完代碼
a.x[0] = 10;
a.x[1] = 1;
之後,16位的空間變為:
00001010 00000001
然後程序運行
printf("%d",a.i);
就是把聯合體a當成一個整數來解析,而不是字元串數組。那麼這樣一來,程序就把這16位變成了一個完整的整數:
(00000001 00001010)二進制 = (266)十進制
注意,你可以看到程序在把16位弄成整數的時候把後面八位放在了前面,前面八位放在了後面。這個反序是計算機存儲結構造成的,這個和聯合體沒有直接關系。如果感興趣的話可以參考匯編語言。

現在我們來看看,你給的例子:

union dt
{
int a;
char b;
double c;
}data;
此時的聯合體所佔的內存大小是8個位元組,接下來執行:
data.a=5;
此此時內存中就不是空的了,也就不會是你說的是隨機數,
但是輸出:printf("%lf",data.c);結果是0.000000,這個結果我還不能給你准確的解釋。但是我可以肯定這與系統把double轉換成int 和int 轉化成 double 有關!!!

暫時我只能解釋這那多!!!

⑹ C語言聯合體

應該選B吧
聯合體其實就是共佔一塊地盤的意思。本題總,c佔1個位元組,而a[0]佔4個位元組,c將與a[0]的最低一個位元組共用一塊空間。而a[0]=0x00000039,所以c=0x39,也就是9.

⑺ c語言中的union是什麼意思啊

1.
c語言中的union
是聯合體,就是一個多個變數的結構同時使用一塊內存區域,區域的取值大小為該結構中長度最大的變數的值
2.
聯合的定義
定義一個聯合類型的一般形式為:
union
聯合名
{
成員表
};
成員表中含有若干成員,成員的一般形式為:
類型說明符
成員名
成員名的命名應符合標識符的規定。
例如:
union
perdata
{

int
class;

char
office;
};
定義了一個名為perdata的聯合類型,它含有兩個成員,一個為整型,成員名為class;另一個為字元數組,數組名為office。聯合定義之後,即可進行聯合變數說明,被說明為perdata類型的變數,可以存放整型量class或存放字元數組office。
3.
聯合變數的說明
聯合變數的說明和結構變數的說明方式相同,
也有三種形式。即先定義,再說明;定義同時說明和直接說明。以perdata類型為例,說明如下:
union
perdata
{

int
class;

char
officae;
};
union
perdata
a,b;
或者可同時說明為:
union
perdata
{
int
class;
char
office;
}a,b;
或直接說明為:
union
{
int
class;
char
office;
}a,b
經說明後的a,b變數均為perdata類型。
a,b變數的長度應等於
perdata
的成員中最長的長度,
即等於office數組的長度,共10個位元組。從圖中可見,a,b變數如賦予整型值時,只使用了2個位元組,而賦予字元數組時,可用10個位元組。
4.
聯合變數的賦值和使用
對聯合變數的賦值,使用都只能是對變數的成員進行。
聯合變數的成員表示為:
聯合變數名.成員名
例如,a被說明為perdata類型的變數之後,可使用
a.classa.office
不允許只用聯合變數名作賦值或其它操作。
也不允許對聯合變數作初始化賦值,賦值只能在程序中進行
5.
聯合」與「結構」有一些相似之處。但兩者有本質上的不同。在結構中各成員有各自的內存空間,
一個結構變數的總長度是各成員長度之和。而在「聯合」中,各成員共享一段內存空間,
一個聯合變數的長度等於各成員中最長的長度。應該說明的是,
這里所謂的共享不是指把多個成員同時裝入一個聯合變數內,
而是指該聯合變數可被賦予任一成員值,但每次只能賦一種值,
賦入新值則沖去舊值。聯合類型的定義和聯合變數的說明一個聯合類型必須經過定義之後,
才能把變數說明為該聯合類型。

⑻ c語言 聯合體問題

什麼數組啊!
人家是聯合體,是C裡面的一種數據類型
樓主,我個人認為,你這樣的用法是錯誤的。
雖然F9的時候沒有報錯
但我從來沒有見過有這么用(也可能是我忘了或本來就見識短)
#include
<stdio.h>
main(){
union{
int
a;
float
b;
char
c;
}x;
x.a=5;
printf("\n%d",x.a);
x.b=105.005;
printf("\n%f",x.b);
x.c='a';
printf("\n%c",x.c);
}
/******原來樓下的****/
由於在聯合體中的各變數內存地址相同,大小為最大的最大類型的長度。初始化5的數據直接儲存與該地址出,按照取值類型進行處理。然而,數據放入內存中的地址是低位元組在前面,而高位元組在後面,所有printf("\n%d",x.c);也輸出5,如果你使用超過一個位元組的數,如258,即
union{
int
a;
float
b;
char
c;
}x;
x.a=258;
printf("\n%d",x.c);
看看,結果就不一致了。
在存放數據的時候是按union里定義的數據類型存放的,讀取的時候也是按union里定義的類型進行讀取的,但輸出的表示形式卻是由printf("\n%d",x.c);
中的(%d)控制的。我們知道char類型的數據只佔一個位元組,所以讀出時也只讀一個位元組的長度,當所放的數據大於一個位元組的時候它會捨去一個位元組的數據,在用%d輸出的時候就會比你原來的int型數據要小256(一個位元組能表示的最大整數)——這就是結果不一至的原因。
還有一個值得重視的是,
x.b=105.005;
printf("\n%f",x.b);
x.c=25;
printf("\n%d",x.a);

x.b=1305.005;
printf("\n%f",x.b);
x.c=25;
printf("\n%d",x.a);
執行後printf("\n%d",x.a);
的結果是不一樣的。原因是我前面已經說過了「在存放數據的時候是按union里定義的數據類型存放的」(但它並不覆蓋原先已經存放過數據的整個union數據區),而讀取的時候還是按union里定義的類型進行讀取的,但輸出的表示形式卻是仍由printf("\n%d",x.c);
中的(%d)控制的。
上面我們雖然x.c都是25,但讀取的時候,是按union中x.a的數據類型(int型)讀出的,這時實際讀出的類型就比x.c的char型數據要多了,多出來的數據就來至x.b在內存中殘留的數據。

⑼ c語言聯合體

union 在這個程序中取四個位元組
對:
s->i[0]=0x39;取前兩個位元組存儲
s->i[1]=0x38;取後兩個位元組存儲
而:
printf("%c\n",s->c[0]);則是取 「s->i[0]=0x39;取前兩個位元組存儲」 中的前一個位元組,又因為0X39的十進制為57(一個位元組最大數64),輸出的9的ascii碼正好小於64,所以輸出的數正好是9.

⑽ c語言中的共用體是什麼

所謂共用體類型是指將不同的數據項組織成一個整體,它們在內存中佔用同一段存儲單元。其定義形式為:
union 共用體名
{成員表列};

union data
{
int a ;
float b;
doublec;
chard;
}obj;
該形式定義了一個共用體數據類型union data ,定義了共用體數據類型變數obj。共用體數據類型與結構體在形式上非常相似,但其表示的含義及存儲是完全不同的。先讓我們看一個小例子。

union data /*共用體*/
{
int a;
float b;
double c;
char d;
}mm;
struct stud /*結構體* /
{
int a;
float b;
double c;
char d;
};
main( )
{
struct stud student;
printf("%d,%d",sizeof(struct stud),sizeof(union data));
}
運行程序輸出:
15,8
程序的輸出說明結構體類型所佔的內存空間為其各成員所佔存儲空間之和。而形同結構體的共用體類型實際佔用存儲空間為其最長的成員所佔的存儲空間。
對共用體的成員的引用與結構體成員的引用相同。但由於共用體各成員共用同一段內存空間,使用時,根據需要使用其中的某一個成員。從圖中特別說明了共用體的特點,方便程序設計人員在同一內存區對不同數據類型的交替使用,增加靈活性,節省內存。

可以引用共用體變數的成員,其用法與結構體完全相同。若定義共用體類型為:
union data /*共用體*/
{
int a;
float b;
double c;
char d;
}mm;
其成員引用為:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同時引用四個成員,在某一時刻,只能使用其中之一的成員。

main( )
{
union data
{
int a;
float b;
double c;
char d;
}mm;
mm.a=6;
printf("%d\n",mm.a);
mm.c=67.2;
printf("%5.1lf\n", mm.c);
mm.d='W';
mm.b=34.2;
printf("%5.1f,%c\n",mm.b,mm.d);
}
運行程序輸出為:
6
6 7.2
3 4.2,=
程序最後一行的輸出是我們無法預料的。其原因是連續做mm.d='W';mm.b=34.2;兩個連續的賦值語句最終使共用體變數的成員mm.b所佔四位元組被寫入34.2,而寫入的字元被覆蓋了,輸出的字元變成了符號「 =」。事實上,字元的輸出是無法得知的,由寫入內存的數據決定。
例子雖然很簡單,但卻說明了共用體變數的正確用法。

熱點內容
ftp網站下載工具 發布:2024-04-18 21:02:45 瀏覽:48
我的世界手游友好的伺服器 發布:2024-04-18 20:57:20 瀏覽:474
php用什麼打開 發布:2024-04-18 20:09:36 瀏覽:732
python訂閱 發布:2024-04-18 20:09:35 瀏覽:533
python開發桌面軟體 發布:2024-04-18 20:09:34 瀏覽:870
我的世界為什麼伺服器比較流暢 發布:2024-04-18 20:05:22 瀏覽:609
上傳到哪了 發布:2024-04-18 19:45:08 瀏覽:317
一觸即發手機軟體復雜腳本 發布:2024-04-18 19:24:29 瀏覽:39
linux查看文件數 發布:2024-04-18 19:19:17 瀏覽:338
linux下qt編譯兩個小時 發布:2024-04-18 18:56:24 瀏覽:546