说你有
void foo(int a, int &b, int *c){...}
int main(){
int d=0, e=1, f=2;
foo(d, e, &f);
}
据我了解,函数声明参数必须与实参具有相同的类型。因此,a、b 和 c 前面的“int”是因为 d、e 和 f 都是整数。
但这是否扩展(也适用于)引用和指针,即 &
和 *
?
我的意思是,如果您有 int &b
,e
是否必须已经是一个地址?
我以为是的,但现在我觉得我读了这个帖子后的概念是错误的: C++ functions: ampersand vs asterisk 其中概述的代码几乎就是我上面写的。
看完线程和上面的代码,似乎参数中的 &
和 *
实际上不是“类型限制”的一部分 - 即它并不意味着 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
}
相反,似乎参数中的 &
实际上采用传入的变量/对象参数并更改或获取其地址。 *
实际上是作用于作为参数传递的 f (&f
) 的地址并检索其内容。这是正确的吗?
这只是给定的 &
和 *
的协议(protocol)/规则放在必须接受的参数中吗?
我看了很多关于参数中的引用和指针的文章,他们都非常清楚地解释了参数中的 &
和 *
允许改变传递的变量值。但是,当放置在参数中时,它们从未深入到 &
和 *
的实际过程/协议(protocol)。
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;
在上面的代码中,运算符&
获取变量n
的地址。
现在考虑下面显示的代码,
int a=111;
int &ref = a;
此处&
用于创建对变量a
的引用。您可以使用变量 ref 来访问变量 a。
运算符*
可用于创建指针变量或获取变量的内容。例如考虑以下代码,
int *ptr;
在上面的代码中,运算符*
用于将ptr
声明为指针变量。
现在考虑下面显示的代码,
int a=111,b;
int *ptr = &a;
b=*ptr;
此处*ptr
用于获取a
的内容。
C++中还有其他运算符,在不同的语境下意义不同,例如,
运算符+
可以是一元或二元运算符。例如 +
是
表达式 c=a+b;
中的二元运算符和表达式 b=+a;
运算符-
可以是一元或二元运算符。例如 -
是
表达式 c=a-b;
中的二元运算符和表达式中的一元运算符
表达式 b=-a;
关于c++ - 在 C++ 中,参数中的引用和指针实际上是如何工作的?他们的固定协议(protocol)/"rule"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16747807/