问题描述
||
#include<stdio.h>
int main()
{
int i = 10;
int *p = &i;
printf(\"\\n address of initialized pointer p: %u \\n\",p);
p = &(*p);
printf(\"\\n modified address of initialized pointer p:%u value:%d valuez address: %d \\n\",p,*p,&(*p));
return 0;
}
代码输出:
初始化指针p的地址:3221221820
初始化指针的修改地址p:3221221820 value:10 valuez地址:-1073745476
为什么\“&(* p)\”在赋值语句和printf语句中使用时表现不同?
更新资料
抱歉,在printf中出现格式说明符错误;)。感谢您的答复并指出。
解决方法
您在printf中使用了不正确的格式说明符。用
%d
打印地址将不起作用。改用%p
。 [打印地址的%u
也不正确。]
这按预期工作。
,指针的标准格式说明符为%p
。为了安全起见,在调用printf
时,应始终将指针明确地指向(void*)
。任何其他格式说明符都不能保证与指针值一起使用。
例如
printf(\"p: %p; *p: %d; &(*p): %p \\n\",(void*)p,*p,(void*)&(*p));
您所看到的区别只是第一个格式说明符为%u
,它将指针值打印为无符号整数,第二次使用using1ѭ,将其值打印为有符号整数。
,你有
当您尝试第二次打印地址时,以%d
代替%u
。
请注意以下修改后的源中的粗体更改:
printf(\“ \\ n的修改地址
初始化的指针p:%u值:%d
valuez地址:%u \\ n \“,p,* p,
&(* p));
最值得注意的是,您应该使用%p来打印出一个指针值,而不要像该线程上另一个答案中已经指出的那样使用%u。