&(*x)如何工作?详情如下
int a = 1;
int* x = &a;
//-> &*x equal to &a
如果指针x的地址为a并*x指向a的值,编译器就无法知道它*x究竟指的是a,只有a当我通过时它才能知道的值*x。
但事实证明它知道。那么这是如何工作的呢?编译器是否也传递了地址,还是只是*在我&像&*x编译一样x或以其他方式进行编译时才取消?
回答
1, a, x,*x都是表达式。
有些表达式有地址(它们被称为“左值”),有些则没有(它们被称为“右值”)。
1是一个右值,它没有地址。所以&1不编译。
a 是一个左值,所以它确实有一个地址。
*x也是一个左值,所以它也有一个地址。这就是语言的工作原理。它可以被制作成不同的(*x可以是一个右值),但它被制作成一个左值,因为地址可用很方便。
对于 operator &,a和之间没有区别*x,因为两者都具有相同的值类别(都是左值)。
您似乎已经假设(即使不知道这些术语)只有变量名是左值(只有它们有地址),但事实并非如此。