刚接触C/C++的人没有意识到的一件事是,*
和&
并不总是运算符的解引用和地址。我没有一次不得不在SO的回答中澄清这一点,但我发现很难用正确而清晰的方式表达出来。
A)
int *p = ...
int &r = ...
B)运算符的解引用/地址。
两者的上下文差异是什么?
A。…在类型声明中吗?
B。是…任何其他表达式。。。
A中的符号叫什么?
一个迂腐、标准的措辞当然会受到赞赏,但这里的意图是向初学者解释这一点。
澄清:这是关于指针/引用上下文的,所以我忽略了明显的算术、逐位运算符。
当*
和&
出现在类型定义中时,它们将分别创建pointer
和reference
类型。(例如,int*
"int pointer"或"pointer to int",int&
"int reference"或"reference to int")。
作为表达式的一部分,*
和&
是上下文敏感的,表达式决定了它们的解释。
*
操作员:
- 间接(即,取消引用指针),请参阅下面的"成员访问运算符"
- 乘法,请参阅下面的"算术运算符"
&
操作员:
- 的地址
- 按位和
另请参阅:
- 成员访问运算符
- 算术运算符
在c++中,'*
'和'&
'可以有三种含义之一(不包括(非标准)重载运算符的含义)
*
运算符通常用于以下操作之一:
- 浮点和整数的乘积(例如
4*3
) - 声明指针(例如
int *foo = 4;
) - 取消引用指针(例如
print(*foo);
)
&
运算符通常用于以下操作之一:
- 按位和(例如
4 & 8
) - 声明引用(例如
int new_foo = 3; int &bar = new_foo;
) - 获取变量的地址(例如
print(&new_foo);
)
A)作为类型声明的一部分:
示例:int* p;
此上下文中的*表示p是int类型的指针变量。它可以保存的值是int变量的地址。不是char、float、double或其他任何东西的地址,只有int的地址。而且它不能容纳int值,这就是普通int变量的工作。
示例:int& p;
&在此上下文中,意味着p是另一个变量的别名。我们选择给另一个变量起第二个名字,p。仅此而已。
B) 其他:
示例:cout << *p;
本文中的*表示"取消引用p"。p是一个指针,作为特定类型的指针,它存储该类型变量的地址。我们告诉它,不要给我们地址。请给我们该地址旁边的值。换句话说,p指针所指向的变量的地址所保持的值。
示例:cout << &p;
&在这种情况下意味着与前面的例子相反。这里,p是一个特定类型的变量,我们并不是告诉它给我们它的值,而是它的地址。
这个故事的寓意是,编程中的每个变量都与两个数字有关:1)它在内存中的地址或位置;2) 它所持有的价值。
想要一个变量来保存特定类型的内存位置吗?将其声明为带有*的指针。希望变量具有别名?用&声明别名;。想要显示一个指针,而不是它的地址,而是它所指向的变量的值?用*取消引用。想要找出一个普通的旧变量的地址吗?使用&运算符,这样您就不会得到它的值。