[英]what is the difference while typecasting a pointer as &(int*) and (int*)& while assigning it to some pointer variable?
如果我们有一个void
指针,并尝试为其分配某些指针变量的地址(例如,指向int的指针),那么语句1和2之间的区别是什么?
对于语句2,我正在lvalue error
,但我没有得到这背后的原因- ptr
是lvalue
仅为何还显示一个错误?
int a;
int *ptr =&a ;
1. void *p =(int*)&ptr;
2. void *p=&(int*)ptr;
根据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*
的赋值,而是右值的运算符&
。
在您的示例中,第二个void *p=&(int*)ptr;
语法不正确,因为&
需要一个左值。
int *n;
void *p = &n;
void *q = &(void *)n; //incorrect syntax will not compile at all
void *w = &(int *)n; //incorrect syntax will not compile at all
所以区别是: &(some_type *)n
根本不会编译,也没有任何意义。
示例代码 。
&(int*)ptr
在C语言中无效。
为什么? 因为p和(类型*)p完全不同。 p是可以获取引用的对象(类型*)p是仅值,后面没有对象,因此它没有地址。
用int强制转换时的行为相同:
int a;
int *ptr = &(int)a;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.