我有以下变量:
char *p;
int l=65;
为什么以下演员表会失败?
(int *)p=&l;
和
p=&((char) l);
答案 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 ++编译器上,它实际上需要如前所述的显式转换(参见其他答案)。