这两个代码示例有什么区别?当我打印变量时p,它会打印指定的值,如下所示.
int *p;
p = 51;
printf("%d",p);
Run Code Online (Sandbox Code Playgroud)
产量:51
当我尝试分配时p=15,我是否在ram中将内存地址设置为"15"作为指针的指针p?当我尝试添加int c = 5 +p;它时输出为71.我为什么要71岁?
我认为内存地址"15"可以存储操作系统,程序等的任何信息.但它确切存储int精确.虽然我改变了p = 150;它给出的价值 int.怎么可能?引擎盖下发生了什么?!我真的不明白.
你的代码是非法的.形式上,它不是C. C语言禁止在没有显式强制转换的情况下为指针类型分配整数值(常量除外0)
你可以做
p = (int *) 51;
Run Code Online (Sandbox Code Playgroud)
(具有实现定义的效果),但你做不到
p = 51;
Run Code Online (Sandbox Code Playgroud)
如果您的编译器允许后一个变体,那么它是一个特定于编译器的扩展,与标准C语言无关.
通常,这种分配使得p指向51存储器中的地址.
最重要的是,使用%d格式说明符打印指针值是违法的printf.%p在使用特定于整数的格式说明符之前,使用或将指针值转换为正确的整数类型.