%p和0x%08x之间有什么区别

yas*_*r99 2 c

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

%p
Run Code Online (Sandbox Code Playgroud)

0x%08x
Run Code Online (Sandbox Code Playgroud)

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

看一下这个:

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);

}
Run Code Online (Sandbox Code Playgroud)

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

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

实际地址是哪个?

asc*_*ler 10

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

如果一个unsigned int和一个指针在它们的堆栈表示中"足够相似",那么将指针传递给后者可能无论如何都可以工作.但无论你的机器是什么,为了安全和正确,总是使用"%p"指针.