使用指针和联合

时间:2014-03-01 22:25:03

标签: c++ c

我刚刚开始学习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

我的指针有问题或我误解了吗?

4 个答案:

答案 0 :(得分:6)

在第一种情况下,您将打印联盟中每个成员的地址。作为工会的成员,他们都有相同的地址。在函数内部,您将打印成员的。 (具有不同的类型,这将产生奇怪的结果。)在第二次printf调用中的每个unaio之前添加&将为您提供预期的结果。

答案 1 :(得分:0)

main()正在格式化工会成员的内存地址,而test()正在格式化成员的

答案 2 :(得分:0)

在主要的第一个printf语句中,您使用'&amp;'返回每个成员的地址(对于一个联合都应该是相同的),但在'Test'函数中,你传递每个联盟成员的值和地址 - 即没有'&amp;'。这就是您获得不同输出值的原因。

答案 3 :(得分:0)

打开编译器上的警告,以便它告诉您它对您的代码的看法。它应该找到大约六个左右的错误。