指针/地址类型转换

时间:2010-04-29 00:05:04

标签: c

我有以下变量:

char *p;
int l=65;

为什么以下演员表会失败?

(int *)p=&l;

p=&((char) l);

5 个答案:

答案 0 :(得分:22)

类型转换的结果始终是 rvalue 。无法分配Rvalue,这就是您的第一个表达式无法编译的原因。 Rvalue不能取地址,这就是你的第二个表达式无法编译的原因。

为了执行正确的类型转换,您必须按照以下步骤进行

p = (char *) &l;

这是在第二个表达式中执行您尝试执行的操作的正确方法。它会将int *指针转换为char *类型。

你的第一个表达无法修复。你可以做到

*(int **) &p = &l;  

但它最终做的不是转换,而是将char *指针占用的内存重新解释 int *指针。这是一个丑陋的非法黑客,大部分时间都没有什么实际价值。

答案 1 :(得分:6)

执行此操作的正确方法是:

int I = 65;
char* p = (char*)&I;

&I为您提供指向int*的{​​{1}};然后,您将其转换为I并将其分配给char*

请注意,通常不应在不相关类型的指针之间进行转换。但是p可用于访问任何对象,因此在这种特殊情况下它是安全的。

答案 2 :(得分:3)

  

(int *)p =& l;

上面的行不起作用,因为只要你将p转换为(int*),结果就是一个匿名的临时对象,它是一个 rvalue 而不是一个左值;通常,结果无法接收作业,即使语言允许,您也会分配到p的临时演员副本,而不是原始p

  

p =&((char)l);

上述一行因类似原因无效; (char) l的结果是一个临时对象,它是l的类型为char的副本。因此,因为它是暂时的,所以你不能拿它的地址。

欧洲工商管理学院,您可以使用:

p = (char*) &l

答案 3 :(得分:0)

问题在于,当你执行演员表时(除了你正在做的演员是否是一个好主意),演员表达式会产生一个右值。

无法将rvalues分配给或使用其地址。

答案 4 :(得分:-1)

在简单的C中,对于转换类型并不严格,此代码将编译并实际工作。在C ++编译器上,它实际上需要如前所述的显式转换(参见其他答案)。