gpt4 book ai didi

c - 指针的地址和指针转换成的int值有什么区别

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:56 25 4
gpt4 key购买 nike

我以为ptr 的地址和a 的地址是一样的。而且我认为ptr的地址与它从指针转换而来的int值是一样的。

但是console的结果却否定了我,请问是什么原因呢?我如何理解结果。

#include <stdio.h>

int main() {
int a[5] = {1, 2, 3, 4, 5};
int *ptr = (int *) ((int) a);

printf("a's address: %p \n", a);
printf("ptr's address: %p \n", ptr);
printf("ptr's int value: %x", (int)ptr);

return 0;
}

控制台的结果是

a's address: 0x7ffee8d30600 
ptr's address: 0xffffffffe8d30600
ptr's int value: e8d30600

ps

标题我已经编辑过了,原来有歧义的标题是“指针的地址和指针的int值有什么区别”

最佳答案

C 有一个 type uintptr_t 它可以让你存储一个指针值:

void *p = …;
uintptr_t u = (uintptr_t)p;
void *q = (void *)q;
// here q is equivalent to p

在许多平台上,u存储 p 对象的地址指向,就像p确实,并且 up在内存中具有相同的表示。这不是义务:允许 C 实现使用不同的表示。但使用相同的表示是满足 C 标准要求的最明显方式。

请注意,来自 uintptr_t 的转换如果 uintptr_t 为指针类型,则只提供可用指针值是从仍然有效的指针获得的。这可能很微妙。即使在表示相同的处理器架构上(几乎所有的处理器架构),编译器也可以假设您没有做太疯狂的事情并相应地进行优化。参见 responses to the Cerberus survey举一些例子。

在您的情况下,您没有尝试将指针值存储在 uintptr_t 中,您尝试将其存储在 int 中.这失败了,因为在您的平台上,int太小,无法存储指针值。显然,在您的平台上,指针是 64 位值和 int是 32 位值。这是一种非常常见的安排。

  • a是数组的地址。 (它是指向数组第一个元素的指针,在您的平台上,指针仅由地址表示。)。在这个特定的运行中,它是 0x7ffee8d30600。那里没什么了不起的。
  • (int) a转换 a 的地址到int值(value)。这是实现定义的。你的实现做了通常的事情:因为 int太小,它会截断该值。将上面的地址截断为无符号的 32 位值会产生 0xe8d30600 .要获得带符号的值,最高有效位成为符号位,因此 a恰好是负数:a-388823552 .
  • p(int *) ((int) a) .此转换又是实现定义的,并且您的实现再次执行与大多数相同的操作。它采用 32 位签名 int-388823552 ,将其扩展到所需的宽度并将其移动到无符号范围,产生 264 - 388823552 = 0xffffffffe8d30600。
  • (int)p应用与 (int)a 相同的截断过程以上,再次产生 -388823552 .但是你使用的是 %x说明符打印出来,所以这个值被转换为 unsigned (您平台上的 32 位类型),其值为 232 - 388823552 = 0xe8d30600。

关于c - 指针的地址和指针转换成的int值有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56411907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com