使用指针和联合

Using pointers and union

本文关键字:指针      更新时间:2023-10-16

我刚刚开始学习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: %xn"
    "uniao.f: %xn"
    "uniao.c: %xn",
    &uniao.i, &uniao.f,&uniao.c);
test(&uniao);
}
void test(union Uniao *uniao){
printf("uniao.i: %xn"
    "uniao.f: %xn"
    "uniao.c: %xn",
    uniao->i, uniao->f,uniao->c);
}

据我了解,指针指向原始变量的内存位置。因此,使用指针的输出应与使用原始变量的输出相同。但我的输出是这样的:

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

我的指针有问题还是我误解了?

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

main()格式化

工会成员的内存地址,而test()则格式化成员的值。

在 main 的第一个 printf 语句中,您使用"&"返回每个成员的地址(对于一个联合来说,所有成员都应该相同),但在"Test"函数中,您传递每个联合成员的值而不是地址 - 即没有"&"。这就是您获得不同输出值的原因。

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