%p和0x%08x

时间:2015-10-25 00:02:46

标签: c

这个问题说明了一切。 在c中,当试图获取指针或其他东西的地址时,我知道命令:

%p

0x%08x

我知道他们都返回地址,但为什么要使用另一个呢?

检查出来:

int main () {

int i[1] = {1};
int *int_pointer;

int_pointer = i;

printf("0x%08x\n",&i);
printf("0x%08x\n", int_pointer);

printf("%p\n",&i);
printf("%p\n", int_pointer);

}

此代码产生此响应:     0x60506b00     0x60506b00     0x7ffe60506b00     0x7ffe60506b00

如果两者都引用地址,那么它们是如何不同的,具体取决于你是使用%p还是0x%08x?

哪个是实际地址?

2 个答案:

答案 0 :(得分:9)

printf("%p", p)期望void*指针作为参数。 printf("0x%08x", n)期望unsigned int作为参数。

将指针传递给后者可能无论如何都可以工作,前提是unsigned int和指针足够相似"在他们在堆栈上的表示。但无论您的机器是什么,为了安全和正确,请始终使用"%p"指针。

答案 1 :(得分:3)

因为%p是可移植的方式。即使指针存储地址,它也不是整数(并且标准不要求编译器使用整数进行指针表示),因此使用整数说明符是不合适的。