如何解决对C中的指针的lvalue和rvalue行为进行澄清
||#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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。