将指针类型转换为&(int *)和(int *)&并将指针分配给某个指针变量时有什么区别?

时间:2018-08-16 11:38:22

标签: c

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

对于语句2,我得到lvalue error,但我没有得到其背后的原因-ptr仅是lvalue,所以为什么会显示错误?

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

3 个答案:

答案 0 :(得分:1)

根据C99规范第6.5.4节第4行,脚注89,在线here可用:

  

强制类型转换不会产生左值

当我们查看您的代码时:

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*而是一个右值上的运算符&

答案 1 :(得分:0)

在您的示例中,第二个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根本不会编译,也没有任何意义。
Sample code

&(int*)ptr在C语言中无效。

为什么?因为p和(类型*)p完全不同。 p是可以获取引用的对象(类型*)p只是值,后面没有对象,因此它没有地址。

答案 2 :(得分:-5)

使用int进行转换时的行为相同:

int a;
int *ptr = &(int)a;