指针/地址类型转换
我有以下变量:
char *p; int l=65;
为什么以下演员表失败?
(int *)p=&l;
和:
p=&((char) l);
类型转换的结果始终是右值 。 无法分配Rvalue,这就是您的第一个表达式无法编译的原因。 Rvalue不能取地址,这就是你的第二个表达式无法编译的原因。
为了执行正确的类型转换,您必须按如下方式进行
p = (char *) &l;
这是在第二个表达式中执行您尝试执行的操作的正确方法。 它将int *
指针转换为char *
类型。
你的第一个表达无法修复。 你可以做
*(int **) &p = &l;
但它到底做了什么并不是真正的转换 ,而是将 char *
指针占用的内存重新解释为int *
指针。 这是一个丑陋的非法黑客,大部分时间都没有什么实际价值。
这样做的正确方法是:
int I = 65; char* p = (char*)&I;
&I
给你一个指向I
的int*
; 然后将其转换为char*
并将其分配给p
。
请注意,通常不应在不相关类型的指针之间进行转换。 但是, char*
可用于访问任何对象,因此在这种特殊情况下它是安全的。
(int *)p =&l;
上面的行不起作用,因为只要将p
为(int*)
,结果就是一个匿名临时对象,它是一个rvalue而不是一个左值 ; 通常,结果无法接收分配,即使语言确实允许,您也将分配给p
的临时转换副本,而不是原始p
。
p =&((char)l);
由于类似的原因,上面的行不起作用; (char) l
的结果是一个临时对象,它是l
类型为char的副本。 因此,因为它是暂时的,所以你不能拿它的地址。
欧洲工商管理学院,您可以使用:
p = (char*) &l
问题在于,当你执行演员表(除了你正在做的演员是否是一个好主意)之外,演员表达式会产生一个右值。
rvalues不能被分配或使用他们的addreses。
在简单的C中,对于转换类型并不严格,这段代码将编译并实际工作。 在C ++编译器上,它实际上需要如前所述的显式转换(参见其他答案)。