将整数文字分配给指针?

时间:2014-06-13 10:38:51

标签: c++ c pointers

这个问题可能太糟糕了,但我可以冒险在这里发布这个问题来解决我的困惑。

实际上我的问题是我们只能为指针分配地址,如: -

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是一个整数。 那么这不违反规则吗?

感谢。

5 个答案:

答案 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 ) ;

请注意,由于显而易见的原因(通常可以指向内存中的任何位置),通常不会安全地使用指针。

有关详细信息,请参阅here和相关问题here

答案 3 :(得分:1)

C的原因与C ++ IIRC不同。在C ++中,0是一个特殊的文字,根据定义,它可以被解释为任何指针类型的空指针;所以在这种情况下, no 从整数转换为指针。要测试这个,您可以尝试这样做:

int i = 0;
int* p = i;

您将发现哪个错误(请参阅此处IDEOne示例)

答案 4 :(得分:1)

实际上,文字0或任何为零的常量值都是例外。它可以分配给指针,它意味着NULLnullptr。相反,任何空指针的计算结果为0

Null不指向任何内存地址位置,其编译器负责处理它。它为null,null在内存中无处可去。它什么都没有。