今天看書看到可以用union構造混合資料型別的陣列 比如
typedef union
{
int a;
char b;
}A
A array[100]
于是 按書上的話:”每個A型別的陣列array的陣列元素都有兩個成員,既可以存盤int型資料,也可以存盤char型別資料“
但是 有幾個疑問:1.在這個陣列的100個元素中是int和char型別對半各50個還是可以自選?
2.這個”兩個成員“是什么意思?是指對半還是只要我在這個陣列中有int型和char型就可以了 可以有1個int和99個char?
還是只能有一個int一個char?
3.在我的測驗中我發現在array中放入字串也可以列印(證明他在陣列中)但是我在union定義中沒有定義char陣列型別也就意味著應該不能存字串吧,可是,可是它列印出來了!
4.測驗時我有加了一個float c 就是:typedef union
{
int a;
char b;
float c;
}A
A array[101]
對應的存了一個小數,但是float卻列印不出來是0.000000,az為什么??
小白求問!真的感謝解答!
uj5u.com熱心網友回復:
你怎么寫的???uj5u.com熱心網友回復:
union就是成員共享一塊記憶體空間比如
union {
int a;
char b;
}
有a,b兩個成員,但是因為空間是共享的,int的空間最大(4個位元組),所以以它為準,a成員使用4個位元組,b成員使用一個位元組,b存在于a里面。如下圖,
整個union的空間為@@@@
a @@@@
b @
也就是a的第一個位元組和b的記憶體空間重合
如果賦值b=1,記憶體變為
a 1@@@
b 1
如果賦值a=1,記憶體變為
a 0001
b 0
可見改變a可能會影響b(因為記憶體共有),同理改變b也可能會影響a
對比一下struct
struct {
int a;
char b;
}
a和b是不共享空間的,所以整個結構體的空間是int的4個位元組+char的1個位元組=5個位元組(先不考慮記憶體對齊,如果考慮對齊就是8個位元組),記憶體分布如下圖
整個struct的空間為@@@@@
a @@@@
b ????@
?表示不使用這些空間,也就是a和b沒有重合的記憶體空間,a使用前4個位元組,b使用后1個位元組
如果賦值b=1,記憶體變為
a @@@@
b ????1
如果賦值a=1,記憶體變為
a 0001
b ????1
可見改變a不影響b(因為a和b的記憶體獨立),同理改變b也不影響a
所以union就是為了讓成員共享一塊記憶體空間,改變一個成員,其他成員也可能發生變化
所以
問題1,100個元素是union型別,每個元素可以存int或char,用戶自己選擇
比如
array[0].a=1;//存int
array[1].b=‘a’;//存char
問題2
兩個成員指a和b,a和b共享同一塊記憶體
問題3
資料存盤最小單元是位元組(char),任何多位元組的型別(其實就相當于char陣列)都可以存字串,只不過記憶體存盤的值不同而已。
比如
int a;
strcpy((char*)&a, “ab”); //int存字串
printf(“%s”, &a); //列印字串
所以你的array存字串也沒問題,只要控制好不記憶體越界就可以
問題4
你是怎么賦值的,上面說了,成員是共享記憶體空間的,給一個成員賦值可能會影響另外的成員,估計是你賦值不對。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/207360.html
標籤:C語言
上一篇:求大神告知 jna連接dll檔案的時候為什么找不到方法
下一篇:g++.exe的退出代碼
