指针/地址类型转换

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 *指针.这是一个丑陋的非法黑客,大部分时间都没有什么实际价值.

  • @AndreyT我不会称之为诡计或黑客.丑陋的是,但在嵌入式编程中是必要的!这是实际强制寄存器的已知地址的唯一方法,通常定义为"0xE000ED28"(对于Cortex M3 CFSR寄存器),为LVALUE!Atmel对Cortex M3 CFSR寄存器的定义是`(*(uint32_t*)0xE000ED28)`.这是必要的(所以不是黑客),但绝对是UGLY.您能否在答案中添加一些关于此的信息? (3认同)

Jam*_*lis 6

这样做的正确方法是:

int I = 65;
char* p = (char*)&I;
Run Code Online (Sandbox Code Playgroud)

&I给你一个int*指向I; 然后char*将其转换为a 并将其分配给p.

请注意,通常不应在不相关类型的指针之间进行转换.但是,A char*可用于访问任何对象,因此在这种特殊情况下它是安全的.