指针/地址类型转换

我有以下变量:

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给你一个指向Iint* ; 然后将其转换为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 ++编译器上,它实际上需要如前所述的显式转换(参见其他答案)。