在 C++ 中,参数中的引用和指针实际上是如何工作的?他们的固定协议/“规则”是什么?

Laz*_*rks 2 c++ parameters pointers parameter-passing pass-by-reference

说你有

void foo(int a, int &b, int *c){...}

int main(){
   int d=0, e=1, f=2;
   foo(d, e, &f);
}
Run Code Online (Sandbox Code Playgroud)

我的理解是函数声明参数必须与参数具有相同的类型。因此 a、b 和 c 前面的“int”是因为 d、e 和 f 都是整数。

但这是否扩展(也适用)到引用和指针,即&*?我的意思是,如果你有int &b,一定e已经是一个地址了吗?

我认为确实如此,但现在我认为在阅读此线程后我的概念是错误的: C++ 函数:&符号与星号 其中概述的代码几乎就是我上面写的。

在阅读了上面的线程和代码之后,似乎参数中的&and*实际上不是“类型限制”的一部分——即它并不意味着 e 必须是地址,或者 f 必须是指针.

以前看到我认为参数a, b, c中的参数名称进行的任何操作都严格指定它必须是什么类型

所以你会编写这样的代码:

void foo(int a, int &b, int *c){...}

int main(){
   int d=0, e=1, f=2;
   foo(d, &e, *f); // wrong 
}
Run Code Online (Sandbox Code Playgroud)

相反,似乎&in 参数实际上采用传入的变量/对象参数并更改或获取其地址。并且*实际上是根据 f ( &f)的地址执行操作,该地址作为参数传递并检索其内容。这是正确的吗?

这只是给定的协议/规则&*放置在必须接受的参数中吗?

我已经阅读了许多关于参数中的引用和指针的文章,它们都非常清楚地解释了参数中的&*允许改变传递的变量的值。但是,他们从来没有走的很深入的实际程序/协议&,并*当放置在参数。

http://www.cplusplus.com/doc/tutorial/functions2/

http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

让我知道我在概念上是否正确。谢谢!

Dee*_*epu 5

产生疑问是因为在 C++ 中,相同的运算符在不同的上下文中用于不同的目的。例如以下运算符在不同情况下具有不同的含义。

运算符&可以表示address-of一个变量或reference一个变量。例如考虑以下代码,

int *ptr;    
int n=111;    
ptr=&n;
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,运算符&获取变量的地址 n

现在考虑下面显示的代码,

   int a=111;    
   int &ref = a;
Run Code Online (Sandbox Code Playgroud)

这里&用于创建对变量的引用a。您可以使用变量 ref 来访问变量 a。

该运算符*可用于创建指针变量或获取变量的内容。例如考虑以下代码,

int *ptr;   
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,运算符* 用于声明ptr为指针变量。

现在考虑下面显示的代码,

int a=111,b;    
int *ptr = &a;
b=*ptr;
Run Code Online (Sandbox Code Playgroud)

这里*ptr用于获取a.

C++ 中还有其他运算符在不同的上下文中具有不同的含义,例如,

运算符+可以是一元或二元运算符。例如+是表达式中的二元运算符和表达式中c=a+b;的一元运算符b=+a;

运算符-可以是一元或二元运算符。例如-是表达式中的二元运算符和表达式中c=a-b;的一元运算符b=-a;