c語言中共用體怎麼申請陣列,C語言中共用體怎麼申請陣列

時間 2022-02-05 13:30:05

1樓:陳冠鋼

也可以這樣:

#include

typedef union tt;

} pos[10];

void main( )

//原來的回答

#include

typedef union tt;

} pos;

void main( )

2樓:

pos 陣列名[10];就可以了得到一個長度為10的陣列;

如果你想得到10個資料單元是union的陣列可以用指標陣列pos *p[10];然後讓p[i];指向申請的地址的開始,如p[0]=(pos *)calloc(10,sizeof(pos));即可。

3樓:今天失眠

跟申請一般陣列一樣唄,pos xx[10];

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

4樓:四舍**入

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

1、節省記憶體

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

2、做某些轉換用

union;

x=20.8;

5樓:楊塵一

在進行某些演算法的c語言程式設計的時候,需要使幾種不同型別的變數存放到同一段記憶體單元中。也就是使用覆蓋技術,幾個變數互相覆蓋。這種幾個不同的變數共同佔用一段記憶體的結構,在c語言中,被稱作「共用體」型別結構,簡稱共用體。

注:在某些書籍中可能稱之為「聯合體」,但是「共用體」更能反映該型別在記憶體的特點。

共用體型別資料的特點

1.同一個記憶體段可以用來存放幾種不同型別的成員,但是在每一瞬間只能存放其中的一種,而不是同時存放幾種。換句話說,每一瞬間只有一個成員起作用,其他的成員不起作用,即不是同時都在存在和起作用。

2.共用體變數中起作用的成員是最後一次存放的成員,在存入一個新成員後,原有成員就失去作用。

3.共用體變數的地址和它的各成員的地址都是同一地址。

4.不能對共用體變數名賦值,也不能企圖引用變數名來得到一個值。

5.共用體型別可以出現在結構體型別的定義中,也可以定義共用體陣列。反之,結構體也可以出現在共用體型別的定義中,陣列也可以作為共用體的成員。

6樓:google也知道

所謂共用體型別是指將不同的資料項組織成一個整體,它們在記憶體中佔用同一段儲存單元。其定義形式為:

union 共用體名

;union data

obj;

該形式定義了一個共用體資料型別union data ,定義了共用體資料型別變數obj。共用體資料型別與結構體在形式上非常相似,但其表示的含義及儲存是完全不同的。先讓我們看一個小例子。

union data /*共用體*/

mm;struct stud /*結構體* /

;main( )

執行程式輸出:

15,8

程式的輸出說明結構體型別所佔的記憶體空間為其各成員所佔儲存空間之和。而形同結構體的共用體型別實際佔用儲存空間為其最長的成員所佔的儲存空間。

對共用體的成員的引用與結構體成員的引用相同。但由於共用體各成員共用同一段記憶體空間,使用時,根據需要使用其中的某一個成員。從圖中特別說明了共用體的特點,方便程式設計人員在同一記憶體區對不同資料型別的交替使用,增加靈活性,節省記憶體。

可以引用共用體變數的成員,其用法與結構體完全相同。若定義共用體型別為:

union data /*共用體*/

mm;其成員引用為:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同時引用四個成員,在某一時刻,只能使用其中之一的成員。

main( )

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);

}執行程式輸出為:

66 7.2

3 4.2,=

程式最後一行的輸出是我們無法預料的。其原因是連續做mm.d='w';mm.

b=34.2;兩個連續的賦值語句最終使共用體變數的成員mm.b所佔四位元組被寫入34.

2,而寫入的字元被覆蓋了,輸出的字元變成了符號「 =」。事實上,字元的輸出是無法得知的,由寫入記憶體的資料決定。

例子雖然很簡單,但卻說明了共用體變數的正確用法。

7樓:淡若親風

共同體是指成員共同使用一段儲存區域,共同體佔用記憶體大小決定於所佔記憶體最大的那個成員,但是實際使用的記憶體會小於等於共同體所佔記憶體大小

8樓:

union

例如定義一個union

union s_un;

s_un s;

你可以用s.s_un_b, s.s_un_w, s_addr訪問實際上訪問的是同一塊記憶體區域,但由於資料型別不同,所以得到的結果可能不一樣。

修改其中一個資料,其他的資料都可能會改變。

union所佔的記憶體大小有最大的那個資料型別決定。

9樓:守望流逝的青春

struct ???

關於c語言中聯合體/共用體中資料存放的問題?

10樓:半糖泡芙

c++ union(聯合/共用體)用法 轉

共用體型別資料的特點

1.同一個記憶體段可以用來存放幾種不同型別的成員,但是在每一瞬間只能存放其中的一種,而不是同時存放幾種。換句話說,每一瞬間只有一個成員起作用,其他的成員不起作用,即不是同時都在存在和起作用。

2.共用體變數中起作用的成員是最後一次存放的成員,在存入一個新成員後,原有成員就失去作用。

3.共用體變數的地址和它的各成員的地址都是同一地址。

4.不能對共用體變數名賦值,也不能企圖引用變數名來得到一個值,並且,不能在定義共用體變數時對它進行初始化。

5.不能把共用體變數作為函式引數,也不能是函式帶回共用體變數,但可以使用指向共用體變數的指標。

6.共用體型別可以出現在結構體型別的定義中,也可以定義共用體陣列。反之,結構體也可以出現在共用體型別的定義中,陣列也可以作為共用體的成員。

1. 共用體宣告和共用體變數定義

共用體是一種特殊形式的變數,使用關鍵字union來定義

共用體宣告和共用體變數定義與結構體十分相似。其形式為:

union 共用體名 變數名;

共用體表示幾個變數共用一個記憶體位置,在不同的時間儲存不同的資料型別和不同長度的變數。在 union中,所有的共用體成員共用一個空間,並且只能儲存其中一個成員變數的值。

下例表示宣告一個共用體foo:

union foo;

再用已宣告的共用體可定義共用體變數。

例如用上面說明的共用體定義一個名為bar的共用體變數, 可寫成:

union foo bar;

在共用體變數bar中, 整型變數i和字元變數c共用同一記憶體位置。

當一個共用體被說明時, 編譯程式自動地產生一個變數, 其長度為聯合中最大的變數長度。以上例而言,最大長度是double資料型別,所以foo的記憶體空間就是double型的長度。

由於union的資料成員共用一個記憶體空間,所以必須存取正確的成員才能正確的讀取變數值,可以使用一個額外的變數或列舉型態來記錄最後一次使用空間的是哪個成員,例如:

#include

using namespace std;

union statemachine

statemachine(int n)

statemachine(char* s)

};enum state ;

int main()

另外要注意的是,union的成員不可以為靜態、參考,如果是自訂型態的話,該自訂型態成員不可以有建構函式、解構函式或是複製指定運運算元。

2. 共用體和結構體的區別

共用體和結構體有 下列區別:

1. 共用體和結構體都是由多個不同的資料型別成員組成, 但在任何同一時刻, 共用體只存放了一個被選中的成員, 而結構體的所有成員都存在。

2. 對於共用體的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於結構體的不同成員賦值是互不影響的。

11樓:豬頭或火寶寶

你好!!!

首先我們瞭解聯合體的所有成員是在記憶體中共享一塊記憶體的,在某一時刻只能有一個成員使用這個記憶體!!!

我們來看看一個例子:

#include

union

a; void main()

答案:266

解釋如下:

union

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

data;

此時的聯合體所佔的記憶體大小是8個位元組,接下來執行:

data.a=5;

此此時記憶體中就不是空的了,也就不會是你說的是隨機數,

但是輸出:printf("%lf",data.c);結果是0.

000000,這個結果我還不能給你準確的解釋。但是我可以肯定這與系統把double轉換成int 和int 轉化成 double 有關!!!

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

12樓:

printf("%lf",data.c);

--》printf("%10.2f",data.c);

結果是5.0。

c語言共用體輸出問題

13樓:匿名使用者

#include

union

s;int main()

////

///聯合體又稱共用體,記憶體的最大空間是最大變數所佔的空間long 和int均佔四個位元組int a[2]佔8個位元組

//s.a[0]=0x39;///整個佔的空間應該是0x0039//s.a[1]=0x38;///整個佔的空間應該是0x0038//printf("%lx\n",s.

b);的時候是s.a[0]記憶體中的內容0x0039,因為是"%lx這種顯示方式所以為39

// printf("%c\n",s.c[0]);的時候是s.a[0]記憶體低地址一個位元組中的內容9 故顯示9

C語言,結構體中的陣列怎麼賦值,C語言中結構體中的陣列,不能直接賦值嗎

1 用字元常量逐個初始化陣列。例如 char a 8 把8個字元依次分別賦給c 0 c 7 這8個元素。如果在定義字元陣列時不進行初始化,則陣列中各元素的值是不可預料的。如果花括號中提供的初值個數 即字元個數 大於陣列長度,則出現語法錯誤。如果初值個數小於陣列長度,則只將這些字元賦給陣列中前面那些元...

c語言陣列賦值問題,c語言中如何給陣列定義並賦初值?

靈凍冰晶霜月 我不清楚你想問什麼,不過第二種寫法是對的。char chars 11 是定義了一個初始值為空總數為11的字元陣列。char s c language 定義一個總數為11的字元陣列,但是有初值。注意是11個不是10個,用這種方定義的字元陣列末尾會加一個 0。陣列的賦值通常是使用花括號來表...

c語言中如何依次輸入陣列中元素,C語言中如何依次輸入陣列中元素

include int main int a 17 int i for i 0 i 17 i scanf d a i return 0 函式功能 把格式化的資料寫入某個字串 函式原型 int sprintf char buffer,const char format argument 返回值 字串長...