首页 > 解决方案 > 将指针类型转换为 &(int*) 和 (int*)& 并将其分配给某个指针变量时有什么区别?

问题描述

如果我们有一个void指针,并尝试将某个指针变量的地址分配给它(例如,指向 int 的指针),那么语句 1 和 2 之间有什么区别。

对于语句 2,我得到了lvalue error,但我没有得到这背后的原因 -ptr只是lvalue为什么它显示错误?

int a;
int *ptr =&a ;
1. void *p =(int*)&ptr;
2. void *p=&(int*)ptr;

标签: c

解决方案


根据 C99 规范的第 6.5.4 节,第 4 行,脚注 89,可在此处在线获取:

强制转换不会产生左值

当我们查看您的代码时:

int a;
int *ptr =&a ;
1. void *p =(int*)&ptr;
2. void *p=&(int*)ptr;

在 1 的情况下:为void指针分配了已被类型转换为 的内容int*。这是有效的。事实上,以下陈述也是有效的:

3. void *p = (int*)123;
4. void *p = (int*)a;
5. void *p = (int*)ptr;

但是如果 2:(int*)ptr已成为一个右值,然后您正在使用&该右值。它未能说明:lvalue required as unary '&' operand

对于 2.,void*导致问题的不是分配,而是&右值上的运算符。


推荐阅读