【问题标题】:Assign integer literal to pointer?将整数文字分配给指针?
【发布时间】:2014-08-03 21:34:11
【问题描述】:

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

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

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 始终是空指针。
  • @barakmanos 实际上你正在将 1 类型转换为 int* 但没有将整数分配给 p
  • C 和 C++ 的答案不同。你不能同时用两种语言编程,选择一种。
  • @DevSolar 不仅仅是演员表。 NULL 的定义在两种语言中是不同的,尤其是考虑到 C++11 时。

标签: c++ c pointers


【解决方案1】:

barak manos 已经在他的评论中指出了这一点:

如果要设置一个指向字面量值的指针,需要先将字面量值强制转换为对应的指针类型。

NULL 也可以定义为 (void *) 0... 可以隐式转换为 any 指针类型。

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

但是,在任何情况下,您的指针都不会指向内存包含文字4。据我所知,如果不先将该文字值分配给 int,这是不可能的:

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

【讨论】:

  • 在 C++ 中,NULL 不能是 (void*)0,因为它不能隐式转换为任何其他指针类型。它必须是一个空指针常量,例如0
  • @MikeSeymour:实际上我一开始并不知道 C++ 标签。在适当的 C++ 中,它当然是 nullptr。 ;-)
  • @DevSolar 正如我们所说,当我们将 0 分配给指针时,它意味着它指向任何内容,但实际上它指向某个内存位置。那么点到无究竟是什么意思呢?
  • @VikasVerma:根据定义,内存地址 0 可能不包含有效的数据对象。从字面上看,这是一个“非法”地址。这就是你的问题吗?
【解决方案2】:

你可以直接在c中设置一个指针的地址:

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

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

更多信息见here和相关问题here

【讨论】:

  • 另外,sizeof( int * ) 可能不是4。 ;-)
  • @DevSolar 确实是特定于机器的
【解决方案3】:

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

当前版本的 C++ 引入了新的 nullptr 关键字,应改为使用。

【讨论】:

  • IIRC,只有文字 0 有这个神奇的属性,而例如1 - 1 没有。
  • @molbdnilo 恰恰相反。任何整数常量表达式求值为零都可以是空指针常量。该属性可用于实现isAnIntegerConstant 宏。
【解决方案4】:

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

int i = 0;
int* p = i;

您会发现会出现错误(请参阅此处查看 IDEOne 示例)

【讨论】:

  • 实际上这不是 C 和 C++ 之间的区别。在 C 中,任何“值为 0 的常量整数表达式”都可以用作空指针。 (请注意,术语“常量整数表达式”在 C 中比在 C++ 中更具限制性)
  • @JensGustedt:很公平。我的立场是正确的,我知道它在 C 中是不同的,这就是所有 #defined NULL (void*)0s 的来源,但我从来没有真正在 C 中工作过。
【解决方案5】:

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

Null 不指向任何内存地址位置,它的编译器负责处理它。它是 null 并且 null 不在内存中。它什么都没有。

【讨论】:

  • 正如我们通常所说的,当我们将 0 分配给指针时,它意味着它指向任何内容,但实际上它指向某个内存位置。那么指向无的究竟是什么意思呢?
  • @VikasVerma:不,它不指向任何内存地址位置,它的编译器有责任处理它。它是 null 并且 null 不在内存中。它什么也没有。
  • 当我打印 p 输出时 000000 那么它的实际含义是什么?
  • @VikasVerma:编译器将 null 评估为 0,然后您会在输出中看到零。
猜你喜欢
  • 1970-01-01
  • 2018-03-26
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多