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/
让我知道我在概念上是否正确。谢谢!
产生疑问是因为在 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;