将整数文字赋值给指针?

3
这个问题可能有些简单,但我可以冒险在这里发布这个问题来解决我的困惑。
实际上,我的问题是我们只能将地址分配给指针,如下所示:-
int *p,a;
p = &a; // OK
p = 1; // Error because you cannot assign integer literal to p*  

但是我们可以像这样将 NULL 赋值给 p :
p = NULL;

实际上,NULL是一个宏,其值为0,在编译器编译此代码之前,预处理器会将其替换为0。因此,在替换后,它看起来像这样:

 p = 0;

我知道这意味着p指向空值,但根据规则我们只能将地址分配给指针,而0是一个整数。 所以这不违反规则吗?
谢谢。

我认为常量0始终是空指针。 - Jayesh Bhoi
@barakmanos 实际上你是将1强制类型转换为int*但没有将整数分配给p。 - Vikas Verma
这个问题的答案对于C和C++是不同的。你不能同时使用两种语言进行编程,必须选择一种。 - Lundin
@DevSolar 这不仅仅是类型转换的问题。在这两种语言中,NULL 的定义也有所不同,特别是考虑到 C++11。 - Lundin
5个回答

5

巴拉克·马诺斯在他的评论中已经指出:

如果您想将指针设置为字面值,您需要首先将字面值强制转换为相应的指针类型。

NULL同样可以定义为(void *)0...它隐式转换为任何指针类型。

无论哪种情况,最终您得到的是一个指向文字地址的指针。

然而,在任何情况下,您的指针都不会指向包含文字4的内存。除非您首先将该文字值分配给int

int i = 4;
int * p = &i;

3
在C++中,NULL不能是(void*)0,因为它不能隐式转换为任何其他指针类型。它必须是一个空指针常量,例如0 - Mike Seymour
@MikeSeymour:其实我一开始并不知道有C++标签。在正式的C++中,当然应该是nullptr。;-) - DevSolar
1
@DevSolar 我们常说,当我们将0赋值给指针时,它意味着它指向了空,但实际上它指向了某个内存位置。那么“指向空”的确切含义是什么? - Vikas Verma
1
@VikasVerma:根据定义,内存地址0可能不持有有效的数据对象。从字面上讲,它是一个“非法”的地址。这是否是你问题的关键? - DevSolar

3

在C语言中,您可以直接设置指针的地址:

char * p  = reinterpret_cast<char *>( 0x0000ffff ) ;

请注意,由于指针可以指向内存中的任何位置,因此通常不被认为是安全的用法。
更多信息请参见这里和相关问题这里

еҸҰеӨ–пјҢsizeof(int*)еҸҜиғҪдёҚжҳҜ4гҖӮ;-) - DevSolar
@DevSolar 的确,这将是机器特定的。 - ldgorman

3

不,它不违反规则。整数常量 0 (以及通常任何计算结果为0的常量表达式)被特殊处理并允许将这样的值赋给指针。这并不意味着您可以分配任何整数-只有零。

C ++的当前版本引入了新的 nullptr 关键字,应该使用它代替。


据我所知,只有字面上的 0 具有这种神奇的属性,而例如 1 - 1 则没有。 - molbdnilo
恰恰相反。任何求值为零的整数常量表达式都可以是空指针常量。该属性可用于实现isAnIntegerConstant宏。 - Petr Skocik

1
这是因为在C和C++中原因不同。在C++中,0 是一个特殊的字面量,根据定义可以被解释为空指针,可以作为任何指针类型的空指针;所以在这种情况下,不存在从整数到指针的强制转换。你可以尝试通过以下方式进行测试:
int i = 0;
int* p = i;

您会发现它会出现错误(请参见IDEOne示例)


实际上这并不是C和C++之间的区别。在C中,任何“值为0的常量整数表达式”都可以作为空指针。 (请注意,“常量整数表达式”一词在C中比在C ++中更具限制性) - Jens Gustedt
@JensGustedt:好的,没问题。我承认我的说法有误,虽然我曾经以为在C语言中是不同的,这也就是为什么会有所有那些“#defined NULL (void*) 0”的情况产生,但实际上我并没有太多在C语言编程方面的经验。 - Jack Aidley

1
事实上,字面值0或任何常量值为零都是一个例外。它可以赋值给指针,意味着NULLnullptr。反过来,任何空指针都会被评估为0
空指针不指向任何内存地址位置,它是编译器的责任来处理它。它是空的,空在内存中不存在。它指向什么都没有。

通常我们说当我们将0赋值给指针时,它意味着它指向了空,但实际上它指向了某个内存位置。那么“指向空”的确切含义是什么? - Vikas Verma
@VikasVerma:不,它不指向任何内存地址位置,这是编译器的责任来处理它。它是null,而null在内存中不存在。它指向什么都没有。 - masoud
当我打印 p 的输出时,输出为 000000,这实际上是什么意思? - Vikas Verma
@VikasVerma:编译器将null评估为0,然后您会在输出中看到零。 - masoud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接