14 c
我有以下变量:
char *p;
int l=65;
Run Code Online (Sandbox Code Playgroud)
为什么以下演员表会失败?
(int *)p=&l;
Run Code Online (Sandbox Code Playgroud)
和:
p=&((char) l);
Run Code Online (Sandbox Code Playgroud)
AnT*_*AnT 23
类型转换的结果始终是右值.无法分配Rvalue,这就是您的第一个表达式无法编译的原因.Rvalue不能取地址,这就是你的第二个表达式无法编译的原因.
为了执行正确的类型转换,您必须按如下方式进行
p = (char *) &l;
Run Code Online (Sandbox Code Playgroud)
这是在第二个表达式中执行您尝试执行的操作的正确方法.它将int *
指针转换为char *
类型.
你的第一个表达无法修复.你可以做
*(int **) &p = &l;
Run Code Online (Sandbox Code Playgroud)
但它到底做了什么并不是真正的转换,而是重新解释char *
指针占用的内存作为int *
指针.这是一个丑陋的非法黑客,大部分时间都没有什么实际价值.
这样做的正确方法是:
int I = 65;
char* p = (char*)&I;
Run Code Online (Sandbox Code Playgroud)
&I
给你一个int*
指向I
; 然后char*
将其转换为a 并将其分配给p
.
请注意,通常不应在不相关类型的指针之间进行转换.但是,A char*
可用于访问任何对象,因此在这种特殊情况下它是安全的.