这个问题可能太糟糕了,但我可以冒险在这里发布这个问题来解决我的困惑。
实际上我的问题是我们只能为指针分配地址,如: -
int *p,a;
p = &a; // OK
p = 1; // Error because you cannot assign integer literal to p*
但是我们可以为p分配NULL,如:
p = NULL;
实际上,NULL是一个值为0的宏,在编译器编译此代码之前,它由preocessor替换为0。所以在更换后看起来像
p = 0;
我知道这意味着p指向什么都没有,但根据规则,我们只能为指针分配地址,但0是一个整数。 那么这不违反规则吗?
感谢。
答案 0 :(得分:3)
如果要设置指向文字值的指针,则需要先将文字值转换为相应的指针类型。
NULL
也可以定义为(void *) 0
...它可以隐式转换为任何指针类型。
在任何一种情况下,最终都会有一个指向文字地址的指针。
但是,在任何情况下,您的指针都指向包含文字4
的内存。据我所知,如果没有将该文字值首先分配给int
,那么这是不可能的:
int i = 4;
int * p = &i;
答案 1 :(得分:3)
不,它不违反规则。整数常量0
(通常是任何常量表达式,评估为0)都经过特殊处理,并允许将此值赋给指针。这并不意味着您可以分配任何整数 - 只需零。
当前版本的C ++引入了新的nullptr
关键字,应该使用它。
答案 2 :(得分:2)
你可以直接在c:
中设置指针的地址char * p = reinterpret_cast<char *>( 0x0000ffff ) ;
请注意,由于显而易见的原因(通常可以指向内存中的任何位置),通常不会安全地使用指针。
答案 3 :(得分:1)
C的原因与C ++ IIRC不同。在C ++中,0
是一个特殊的文字,根据定义,它可以被解释为任何指针类型的空指针;所以在这种情况下, no 从整数转换为指针。要测试这个,您可以尝试这样做:
int i = 0;
int* p = i;
您将发现哪个错误(请参阅此处IDEOne示例)
答案 4 :(得分:1)
实际上,文字0
或任何为零的常量值都是例外。它可以分配给指针,它意味着NULL
或nullptr
。相反,任何空指针的计算结果为0
。
Null不指向任何内存地址位置,其编译器负责处理它。它为null,null在内存中无处可去。它什么都没有。