當前位置:首頁 » 編程語言 » c語言聯合體和共同體
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言聯合體和共同體

發布時間: 2022-11-27 16:37:45

㈠ 在c語言中,共用體一般有什麼作用

共用體一般指聯合體,作用如下:

1、節省內存

有兩個很長的數據結構,不會同時使用,用結構體的話,只佔用最長的那個數據結構所佔用的空間,就足夠了。

2、做某些轉換用

union{char a[8];double x;};

x=20.8;

cout<<hex<<a[0]<<「 」<<a[1]<<…<<endl;

(1)c語言聯合體和共同體擴展閱讀:

結構體和共用體

結構體和共用體的區別在於:結構體的各個成員會佔用不同的內存,互相之間沒有影響;而共用體的所有成員佔用同一段內存,修改一個成員會影響其餘所有成員。

結構體佔用的內存大於等於所有成員佔用的內存的總和(成員之間可能會存在縫隙),共用體佔用的內存等於最長的成員佔用的內存。

共用體使用了內存覆蓋技術,同一時刻只能保存一個成員的值,如果對新的成員賦值,就會把原來成員的值覆蓋掉。

共用體也是一種自定義類型,可以通過它來創建變數,

㈡ C語言共同體問題

結果應該是輸出一個隨機數!有這樣幾個概念關於共用體,也就是你說的共同體:

1、共用體是幾種不同的變數存放在同一內存當中,即在內存中占同一位置

2、同一內存段可以用來存放幾種不同類型的成員,但是在每一瞬只能放其中的一種,而不是同時存放幾種類型。也就是每一瞬只有一個成員起作用!

3、共用體變數中起作用的成員是最後一次存放的成員。

根據以上原則來看你這道題:

#include
"stdio.h"

union
un

{

int
i;

char
c[2];

}
//共用體變數定義完成後應當以分號結束,此處應該加一個分號

main()

{

union
un
x;
//定義共用體變數x

x.c[0]=10;
//字元數組第一個字元位置存放整型10,字元變數和整型變數可以相互轉換

x.c[1]=1;
//字元數組第二個字元位置存放整型1

//至此,共用體變數x.c成員被賦值,其中x.c[0]==10,x.c[1]==1,而x.i不起作用

printf("\n%d",x.i);
//因為x.i沒有被賦值,所以它的值由內存自動分配,所以會產生隨機數

}

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

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

㈣ 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,而寫入的字元被覆蓋了,輸出的字元變成了符號「 =」。事實上,字元的輸出是無法得知的,由寫入內存的數據決定。
例子雖然很簡單,但卻說明了共用體變數的正確用法。

㈤ 關於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語言有關共用體的使用方法,請前輩們請教謝謝啦!

共用體又稱聯合體,關鍵字union,正如其名字,其成員變數共同佔用同一段內存,這段內存的大小就是所有成員中最大的那個,所以整個共用體變數大小就是其最大成員大小,比如你代碼中的A大小就是成員c的大小8個位元組。
至於用處還是有很多的:
比如我們表示一個學生分數,有幼兒,小學,初中,這三種學生信息結構基本相同,但只有分數標准不一樣,幼兒分數(差、中、優),小學(C、B、A),初中(0~100分)。那麼我們就可以把學生信息定義成結構體,而結構成員分數那一塊定義成共用體(包含字元串類型,字元類型、數值類型)。這樣結構本身就不需要定義三種類型成員了。
又比如,數據傳遞時,用共用體表示數據,之後只要按照你的需求按不同格式獲取數據。

㈦ C語言中的聯合又什麼

樓主強,會員都出來了,難道其英文叫做vip?

呵呵

union myunion //聯合體名
{
//添加聯合體變數
};

㈧ C語言定義共同體的保留字是什麼

共同體也叫聯合體、共用體。定義共同體的保留字是union。
比如:
union un
{
char ch;
short sh;
int i;
};
union un u1;
則為u1分配的位元組數等於sizeof(int),即等於共同體中需要位元組數最多的那個成員所分配的位元組數。u1的ch與i成員共用第一位元組,sh與i成員共用第一和第二位元組,而為u1分配的第三和第四位元組,只能通過i訪問到。

㈨ C語言中共同體和聯合體有什麼區別

同一東東的不同翻譯
有些書翻譯成聯合體,有些叫共同體或共用體

㈩ c語言中結構體和共同體及應用不是很明白,試舉例說明。

聯合體(union)和結構體(struct)的區別
1. 聯合說明和聯合變數定義

聯合也是一種新的數據類型, 它是一種特殊形式的變數。
聯合說明和聯合變數定義與結構十分相似。其形式為:
union 聯合名{
數據類型 成員名;
數據類型 成員名;
...
} 聯合變數名;

聯合表示幾個變數公用一個內存位置, 在不同的時間保存不同的數據類型 和不同長度的變數。
下例表示說明一個聯合a_bc:
union a_bc{
int i;
char mm;
};

再用已說明的聯合可定義聯合變數。
例如用上面說明的聯合定義一個名為lgc的聯合變數, 可寫成:
union a_bc lgc;
在聯合變數lgc中, 整型量i和字元mm公用同一內存位置。
當一個聯合被說明時, 編譯程序自動地產生一個變數, 其長度為聯合中最大的變數長度。

聯合訪問其成員的方法與結構相同。同樣聯合變數也可以定義成數組或指針,但定義為指針時, 也要用"->;"符號, 此時聯合訪問成員可表示成:
聯合名->成員名

另外, 聯合既可以出現在結構內, 它的成員也可以是結構。
例如:
struct{
int age;
char *addr;
union{
int i;
char *ch;
}x;
}y[10];

若要訪問結構變數y[1]中聯合x的成員i, 可以寫成:
y[1].x.i;
若要訪問結構變數y[2]中聯合x的字元串指針ch的第一個字元可寫成:
*y[2].x.ch;
若寫成"y[2].x.*ch;"是錯誤的。

2. 結構和聯合的區別
結構和聯合有下列區別:
1) 結構和聯合都是由多個不同的數據類型成員組成, 但在任何同一時刻, 聯合轉只存放了一個被選中的成員, 而結構的所有成員都存在。
2) 對於聯合的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於結構的不同成員賦值是互不影響的。
下面舉一個例了來加對深聯合的理解。

main()
{
union{ /*定義一個聯合*/
int i;
struct{ /*在聯合中定義一個結構*/
char first;
char second;
}half;
}number;

number.i=0x4241; /*聯合成員賦值*/
printf("%c%c\n", number.half.first, mumber.half.second);
number.half.first='a'; /*聯合中結構成員賦值*/
number.half.second='b';
printf("%x\n", number.i);
getch();
}
輸出結果為:
AB
6261

從上例結果可以看出: 當給i賦值後, 其低八位也就是first和second的值;當給first和second賦字元後, 這兩個字元的ASCII碼也將作為i 的低八位和高八位。