对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。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...