我有以下变量:
char *p;
int l=65;
为什么下面的强制类型转换会失败?(int *)p=&l;
并且:
p=&((char) l);
我有以下变量:
char *p;
int l=65;
为什么下面的强制类型转换会失败?(int *)p=&l;
并且:
p=&((char) l);
类型转换的结果始终是rvalue。无法将rvalue赋值,这就是为什么您的第一个表达式无法编译的原因。无法获取rvalue的地址,这就是为什么您的第二个表达式无法编译的原因。
为了执行正确的类型转换,您必须按以下方式进行操作
p = (char *) &l;
这是在第二个表达式中正确执行的方法。它将int *
指针转换为char *
类型。
你的第一个表达式已经无法修复了。你可以尝试:
*(int **) &p = &l;
但它最终所做的并不是真正的转换,而是将被char *
指针占用的内存重新解释为int *
指针。这是一个丑陋的非法技巧,大部分时间几乎没有实际价值。
0xE000ED28
,对于Cortex M3 CFSR寄存器)成为LVALUE! Atmel 对 Cortex M3 CFSR 寄存器的定义为 (* (uint32_t*) 0xE000ED28)
。这是必要的(因此不是黑客行为),但绝对很丑陋。您能否在您的答案中添加一些关于这方面的信息? - nonsensickle正确的做法应该是:
int I = 65;
char* p = (char*)&I;
&I
会给你一个指向I
的int*
,然后你将其转换为char*
并分配给p
。
请注意,通常不应该在不相关类型之间进行指针转换。但是,在这种特定情况下,char*
可用于访问任何对象,因此是安全的。
(int *)&l
该行无法运行,因为一旦将p
强制转换为(int*)
,结果就是一个匿名临时对象,这是一个rvalue而不是lvalue;因此,结果不能接收赋值,即使语言允许,你也会将值分配给转换后的p
的临时复制品,而不是原始的p
。
p=&((char) l);
上述代码类似地无法运行;(char) l
的结果是l
强制转换为char类型的临时对象。因此,由于它是临时的,您无法获取其地址。
相反,您可以使用:
p = (char*) &l
+
的结果一样 - 你不能做&((char)l)
,原因和你不能做&(a + b)
一样。 - caf