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

mta*_*med 25 c c++ pointers casting

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

int *ptoi = 17; // I assumed that 17 is being automatically casted to int *
Run Code Online (Sandbox Code Playgroud)

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

int *ptoi = (int *)17;
Run Code Online (Sandbox Code Playgroud)

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

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

Car*_*rum 17

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

example.c:5:8: warning: incompatible integer to pointer conversion initializing
      'int *' with an expression of type 'int'
  int *x = 17;
       ^   ~~
Run Code Online (Sandbox Code Playgroud)

C99在第6.5.4节演员操作员第4段中说:

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

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

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

下面未提及且未由用户明确定义的任何类型转换都是错误的.

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

  • @JohnBode 6.3.2.3(5)正在谈论转换的结果,但这不是问题.6.5.16.1(1)讨论了在赋值操作中允许哪些隐式转换.允许左操作数为指针类型且右操作数为整数的唯一情况是情况5,并且限制是右操作数是空指针常量,其中17不是.6.5.4(3)说"涉及指针的转换,除了6.5.16.1的约束允许的情况外,*应通过演员*来指定." (4认同)
  • "从整数转换为没有强制转换的指针在C中也是非法的." 不符合6.3.2.3/5:"整数可以转换为任何指针类型.除了先前指定的,结果是实现定义的,可能没有正确对齐,可能不指向引用类型的实体,并且可能是一个陷阱表示.56)"简而言之,结果可能没有意义,但它肯定不是*非法*. (3认同)