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

时间:2013-09-25 23:40:13

标签: c pointers casting

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

int num = 10;
int *p = (char *) #

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

int num = 10;
int *p = (int *) (char *) &num ;

如果以下情况可以:

char eu = (short) 10;

我们不需要这样做:

char eu = (char) (short) 10;
那么为什么我们需要在指针定义中显式添加基类型?

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:2)

C不会隐式地从一种指针类型转换为另一种指针类型,除非其中一种是void *。通常,这种转换可能不可能。

例如,假设在给定平台上,指向整数的指针必须与四字节边界对齐。您不希望编译器以静默方式尝试将char *(可能未对齐)转换为int *

通过插入一个显式的演员,你告诉编译器,“相信我,我知道我在做什么。”

答案 2 :(得分:0)

允许自动指针转换可能会导致一些意外结果。例如,大多数体系结构允许以1字节加载/存储字节存储器访问,但需要对齐2,4或8字节存储器访问。如果为int *分配一个未对齐的char指针,那么访问它会导致异常或减慢访问速度