[英]What happens if I assign to an int pointer a float variable address and vice-versa?
我想知道如果我给一个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
您的代码中有许多未定义行为的实例:
int n = 5;
: 好的float f = 1.21;
: 好的float *pf = &n;
用指向不同类型的指针的值初始化一个指针。 C 标准不保证这会做什么,也不保证当你取消引用这个指针时会发生什么。 使用-Wall -W
,您肯定会收到警告,您可以通过-Wall -W
使其静音: float *pf = (float *)&n;
,但结果是相同的,取消引用指针具有未定义的行为。int *pn = &f;
和上面一样。 printf("%p %p\\n", pn, pf);
-> 你应该将指针转换为(void *)
因为%p
需要一个void *
作为参数。 在一些罕见的系统(旧的 Cray 系统 IIRC)上,指向int
、 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
正如预期的那样。Chqrlie的回答比我的好得多。 请重新接受他的回答。
你不应该滥用指针和对象——即使不是出于好奇的原因。 1., 2., 5. printf
命令的结果是正确的,而3., 4. printf
命令的结果是Undefined Behavior的产物,没有人可以解释。
有关未定义行为的更多信息: 未定义、未指定和实现定义的行为
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.