首页 > 解决方案 > 如果我为 int 指针分配一个浮点变量地址,反之亦然,会发生什么?

问题描述

我想知道如果我给一个int指针一个float变量地址会发生什么,反之亦然,所以我试了一下,但不能完全理解发生了什么,所以如果有人能解释一下,我将不胜感激。

int n = 5;
float f = 1.21;
float *pf = &n;
int *pn = &f;

printf("%p  %p\n", pn, pf);
printf("%p  %p\n", &f, &n);
printf("%d   %f \n", *pn, *pf);
printf("%f   %d \n", n, f);
printf("%d  %f \n", n, f);

输出:

0xffffcba8 0xffffcbac
0xffffcba8 0xffffcbac
1067114824 0.000000
0.000000 0
5 1.210000

标签: cpointers

解决方案


您的代码中有许多未定义行为的实例:

  • int n = 5;: 好的
  • float f = 1.21;: 好的
  • float *pf = &n;用指向不同类型的指针的值初始化指针。C 标准不保证 this 的作用,也不保证取消引用 this 指针时会发生什么。使用-Wall -W,您肯定会收到警告,您可以使用强制转换使其静音:float *pf = (float *)&n;,但结果是相同的,取消引用指针具有未定义的行为。
  • int *pn = &f;和上面一样。
  • printf("%p %p\n", pn, pf);-> 您应该将指针转换为,(void *)因为%p需要 avoid *作为参数。int在一些罕见的系统(旧的 Cray 系统 IIRC)上,指向float和的指针void可能有不同的表示,导致此调用以printf意想不到的方式运行。改用这个:

    printf("%p  %p\n", (void *)pn, (void *)pf);
    
  • printf("%p %p\n", &f, &n);- >同样的问题。改用这个:

    printf("%p  %p\n", (void *)&f, (void *)&n);
    

    两个表达式的输出都是正确且相同的,因为您的系统是常规的,但 C 标准不保证这一点。

  • printf("%d %f \n", *pn, *pf);这是正确的,但取消引用指针具有未定义的行为。
  • printf("%f %d \n", n, f);传递与预期类型不同的类型的值具有未定义的行为。您得到的输出不正确。
  • printf("%d %f \n", n, f);这个是正确的,输出5 1.210000符合预期。

推荐阅读