c++ - 在 C++ 中,参数中的引用和指针实际上是如何工作的?他们的固定协议(protocol)/"rule"是什么?

标签 c++ pointers parameters 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);
}

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

但这是否扩展(也适用于)引用和指针,即 &*? 我的意思是,如果您有 int &be 是否必须已经是一个地址?

我以为是的,但现在我觉得我读了这个帖子后的概念是错误的: 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/

相关文章:

php 类型检查方法参数 - 值得吗?

c++ - 实现标记 union 的移动构造函数

c++ - Boost ASIO socket 消耗文件描述符

c++ - (lldb) 错误代码在带有 C++ 的 Xcode 中不起作用

java - 在 Java 中指向整数的指针

c - 函数中的指针 "expected expression before = token"

c - 二叉搜索树指针问题

java - JUnit parameterized Tests 获取测试后的参数

python - 重新获取值或随身携带它们

c++ - 编写带有 do-while 循环的程序并要求用户选择是/否