我无法理解为什么以下几行在gcc中给出了`'从不兼容的指针类型初始化'':
int num = 10;
int *p = (char *) #
为什么编译器不清楚我想要这个(当我这样做时,警告消息消失):
int num = 10;
int *p = (int *) (char *) &num ;
如果以下情况可以:
char eu = (short) 10;
我们不需要这样做:
char eu = (char) (short) 10;
那么为什么我们需要在指针定义中显式添加基类型?
答案 0 :(得分:5)
嗯,它只是定义语言的方式:不同类型的对象指针不能在彼此之间隐式转换。你需要明确的演员。
在大多数情况下,取消引用错误类型的指针是未定义的行为,所以要求你明确这种类型的强制转换是一种非常合理的预防措施。
这是一个好的设计的标志,容易的事情很容易(例如int * p = #
),而且狡猾的事情是冗长的,所以很明显你做的事情很奇怪。
(请注意,在C(但不是C ++)中,您可以通过 void 指针隐式转换:int * p = (void *)#
)
答案 1 :(得分:2)
C不会隐式地从一种指针类型转换为另一种指针类型,除非其中一种是void *
。通常,这种转换可能不可能。
例如,假设在给定平台上,指向整数的指针必须与四字节边界对齐。您不希望编译器以静默方式尝试将char *
(可能未对齐)转换为int *
。
通过插入一个显式的演员,你告诉编译器,“相信我,我知道我在做什么。”
答案 2 :(得分:0)
允许自动指针转换可能会导致一些意外结果。例如,大多数体系结构允许以1字节加载/存储字节存储器访问,但需要对齐2,4或8字节存储器访问。如果为int *分配一个未对齐的char指针,那么访问它会导致异常或减慢访问速度