为什么`int*p =(char*)&num'导致警告?

use*_*840 0 c pointers casting

我无法理解为什么以下几行在gcc中给出了"从不兼容的指针类型初始化":

int num = 10;
int *p = (char *) #
Run Code Online (Sandbox Code Playgroud)

为什么编译器不清楚我想要这个(当我这样做时,警告消息消失):

int num = 10;
int *p = (int *) (char *) &num ;
Run Code Online (Sandbox Code Playgroud)

如果以下情况可以:

char eu = (short) 10;
Run Code Online (Sandbox Code Playgroud)

我们不需要这样做:

char eu = (char) (short) 10;
Run Code Online (Sandbox Code Playgroud)

那为什么我们需要在指针定义中显式添加基类型?

Ker*_* SB 5

嗯,它只是定义语言的方式:不同类型的对象指针不能在彼此之间隐式转换.你需要明确的演员.

在大多数情况下,取消引用错误类型的指针是未定义的行为,所以要求你明确这种类型的转换是一个非常合理的预防措施.

这是一个好的设计的标志,简单的事情很简单(例如int * p = #),而狡猾的事情是冗长的,所以很明显你做了一些奇怪的事情.

(请注意,在C(而不是C++),你可以通过隐式转换无效指针:int * p = (void *)#)

  • @ user1042840:你不能将`char*`隐式转换为`int*`. (3认同)
  • @DyP:6.5.4.3:"除了6.5.16.1的约束允许之外,涉及指针的转换应通过显式转换来指定." 有问题的许可是允许隐式转换为"void*". (3认同)