这个问题可能太糟糕了,但我可以冒险在这里发布这个问题来解决我的困惑。
实际上我的问题是我们只能为指针分配地址,例如:-
int *p,a;
p = &a; // OK
p = 1; // Error because you cannot assign integer literal to p*
Run Code Online (Sandbox Code Playgroud)
但是我们可以将 NULL 分配给 p 像:
p = NULL;
Run Code Online (Sandbox Code Playgroud)
实际上,NULL 是一个值为 0 的宏,在编译器编译此代码之前,它会被预处理器替换为 0。所以更换后它的样子
p = 0;
Run Code Online (Sandbox Code Playgroud)
我知道这意味着 p 不指向任何内容,但根据规则,我们只能将地址分配给指针,但 0 是整数。所以这不是违反规则吗?
谢谢。
barak manos 已经在他的评论中指出了这一点:
如果要设置指向字面值的指针,则需要先将字面值强制转换为对应的指针类型。
NULL也可以定义为(void *) 0... 它可以隐式转换为任何指针类型。
无论哪种情况,最终都会得到一个指向文字地址的指针。
但是,在任何情况下,您的指针都不会指向包含文字 的内存4。据我所知,如果不将该字面值分配给int第一个,这是不可能的:
int i = 4;
int * p = &i;
Run Code Online (Sandbox Code Playgroud)