2014-03-01 70 views
0

我剛剛開始學習C.我認爲我在這裏做了錯誤的指針或不明白它的意思。看看這個:使用指針和聯合

#include <stdio.h> 

union Uniao{ 
int i; 
float f; 
char c[4]; 
}; 
void test(union Uniao *uniao); 
int main(){ 
union Uniao uniao; 
printf("uniao.i: %x\n" 
    "uniao.f: %x\n" 
    "uniao.c: %x\n", 
    &uniao.i, &uniao.f,&uniao.c); 
test(&uniao); 
} 
void test(union Uniao *uniao){ 
printf("uniao.i: %x\n" 
    "uniao.f: %x\n" 
    "uniao.c: %x\n", 
    uniao->i, uniao->f,uniao->c); 
} 

據我所知,一個指針指向原始變量的內存位置。所以使用指針的輸出應該與使用原始變量的輸出相同。但我的輸出是這樣的:

uniao.i: bfeac1dc 
uniao.f: bfeac1dc 
uniao.c: bfeac1dc 
uniao.i: b77abff4 
uniao.f: 80000000 
uniao.c: beef57fe 

是否有我的指針有問題或我誤解了它?

+0

請解釋你的意圖,試着描述你想達到的目標。 – user2485710

+0

你的工會未初始化 – mathematician1975

+0

@ mathematician1975我認爲這並不重要,因爲內存已經分配,​​我只是想要它的位置。 – Junior

回答

6

在第一種情況下,您打印的是工會的每個成員的地址。作爲工會的成員,他們都有相同的地址。在函數內部,您正在打印的成員。 (其中,具有不同的類型,這裏會產生奇怪的結果。)在第二次printf調用中的每個unaio之前添加&將爲您提供期望的結果。

+0

你是對的,謝謝。我雖然我需要使用*來使指針打印值,但我只是測試了你說的和它的工作。我會在3分鐘內接受你的回答。 – Junior

0

main()被格式化存儲器地址的聯盟成員的,而test()被格式化值成員代替。

0

在你使用'&'你的第一個printf語句返回每個成員的地址(所有對於一個union都應該是一樣的),但是在'Test'函數中你傳遞了每個union成員的值和地址 - 即沒有'&'。這就是爲什麼你得到不同的輸出值。

+0

是的,雖然我需要用*使指針打印數值,謝謝 – Junior

0

在您的編譯器上打開警告,以便它告訴您對代碼的看法。它應該找到六個左右的錯誤。

+0

你是對的。因爲它顯示了一些警告,我認爲他們已經上了。 – Junior