清楚地说明 * 和 & 作为类型的一部分和作为取消引用/address_of操作符之间的区别



刚接触C/C++的人没有意识到的一件事是,*&并不总是运算符的解引用和地址。我没有一次不得不在SO的回答中澄清这一点,但我发现很难用正确而清晰的方式表达出来。

A)

int *p = ...
int &r = ...

B)运算符的解引用/地址。


  1. 两者的上下文差异是什么?

    A。…在类型声明中吗?

    B。是…任何其他表达式。。。

  2. A中的符号叫什么?

一个迂腐、标准的措辞当然会受到赞赏,但这里的意图是向初学者解释这一点。

澄清:这是关于指针/引用上下文的,所以我忽略了明显的算术、逐位运算符。

*&出现在类型定义中时,它们将分别创建pointerreference类型。(例如,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) 它所持有的价值。

想要一个变量来保存特定类型的内存位置吗?将其声明为带有*的指针。希望变量具有别名?用&声明别名;。想要显示一个指针,而不是它的地址,而是它所指向的变量的值?用*取消引用。想要找出一个普通的旧变量的地址吗?使用&运算符,这样您就不会得到它的值。

相关内容

最新更新