为什么我可以隐式地将int文字转换为C中的int *而不是C ++中的int *?

时间:2011-11-27 19:50:15

标签: c++ c pointers casting

我相信在下面的代码中,C“自动将17转换为int *”,正如有人最近指出的那样(但没有说明原因),这是错误的。

int *ptoi = 17; // I assumed that 17 is being automatically casted to int *

我知道如果我在C ++中做同样的事情,我会收到错误invalid conversion from int to int *。但是,如果我在C ++中执行以下操作,它可以正常工作:

int *ptoi = (int *)17;

这些是我认为在C中,铸造是隐含的原因。

有人可以解释为什么,在C ++中,我必须使用它,但在C中,它可以正常工作吗?

4 个答案:

答案 0 :(得分:17)

从整数到没有强制转换的指针的转换在C中也是非法的。大多数编译器会让你逃脱它。 Clang发出警告:

example.c:5:8: warning: incompatible integer to pointer conversion initializing
      'int *' with an expression of type 'int'
  int *x = 17;
       ^   ~~

C99在第6.5.4节演员中说明,第4段:

  

涉及指针的转换,除了6.5.16.1的约束允许的范围外,应通过显式转换来指定。

6.5.16.1是void *转换为其他指针而不需要强制转换的例外。

C ++规范在第5.4节显式类型转换(强制转换表示法)中说明,第3段:

  

以下未提及但未由用户明确定义的任何类型转换都是格式错误。

所以你去 - 两种语言都是非法的,但是为了与许多旧软件兼容,很多C编译器都会让你逃脱它。

答案 1 :(得分:2)

是的,虽然许多(所有?)编译器发出警告,但是C中隐含了强制转换。在C ++中,没有从intint*执行隐式转换,因此需要显式转换。

答案 2 :(得分:2)

一直以来,C都有隐式转换 - 根据我的经验,几乎从任何整数类型到任何其他整数类型。 C中的指针是被认为是整数 scalar 类型。

在C ++中,积分类型定义如下:

  

类型boolcharchar16_tchar32_twchar_t以及signedunsigned整数类型统   称为整数类型。 48 整数类型的同义词是整数类型。整数类型的表示   应使用纯二进制数字系统定义数值。 49 [例如:本国际标准   允许2的补码,1的补码和积分类型的带符号幅度表示。 -结束   例子]

可以在C ++中转换为指针类型的唯一整数值​​是空指针常量,但从技术上讲,转换为prvalue类型std::nullptr_t。 (第4.10段)

最后的注释

而不是像这样修复它:

int *ptoi = (int *)17;

考虑添加C ++风格的演员:

int *ptoi = reinterpret_cast<int*>(17);

清楚说明您要调用的转换类型

答案 3 :(得分:1)

编译器会将int *ptoi = 17;解释为指向位置17(0x00000011)处的整数的变量ptoi。

C只是一种完全不同的语言。它可能看起来像C ++,但事实并非如此。不同的规则适用于这两种语言。

我应该指出,C和C ++都会(据我所知)使它成为指向0x00000011的指针,但C只是抱怨较少,因为分配内存位置在C中是无效的。