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

C++ 在C++;参数中的引用和指针实际上是如何工作的?他们的固定协议是什么;规则;?,c++,pointers,parameters,parameter-passing,pass-by-reference,C++,Pointers,Parameters,Parameter Passing,Pass By Reference,说你有 void foo(inta,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 但这是否扩展(也适用)到引用和指针,即&和*? 我的意思是,如果你有int&b,那么e必须已经是地址了吗 我原以为是的,但现在我觉得读了这篇文章后,我的概念错了: 其中,中概述的代码与我上面所写的基本相同

说你有

void foo(inta,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

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

我原以为是的,但现在我觉得读了这篇文章后,我的概念错了: 其中,中概述的代码与我上面所写的基本相同

在阅读了上面的线程和代码之后,似乎参数中的
&
*
实际上不是“类型限制”的一部分——也就是说,它并不意味着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 
}
相反,参数中的
&
似乎实际接受传入的variabe/object参数,并更改或获取其地址。而
*
实际上是作用于f(
&f
)的地址,该地址作为参数传递并检索其内容。是这样吗

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

我读过很多关于参数中的引用和指针的文章,它们都非常清楚地解释了参数中的
&
*
允许更改传递的变量的值。但是,当将它们放入参数中时,它们不会深入到
&
*
的实际过程/协议中

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

>怀疑出现,因为在C++中,在不同的上下文中,相同的操作符用于不同的目的。例如,以下运算符在不同情况下具有不同的含义

运算符
&
可以表示变量的
地址或变量的
引用。例如,考虑下面的代码,

int *ptr;    
int n=111;    
ptr=&n;
int *ptr;   
在上述代码中,运算符
&
获取变量
n
的地址

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

   int a=111;    
   int &ref = a;
int a=111,b;    
int *ptr = &a;
b=*ptr;
此处
用于创建变量
a
的引用。您可以使用变量ref访问变量a

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

int *ptr;    
int n=111;    
ptr=&n;
int *ptr;   
在上述代码中,运算符
*
用于将
ptr
声明为指针变量

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

   int a=111;    
   int &ref = a;
int a=111,b;    
int *ptr = &a;
b=*ptr;
这里使用
*ptr
获取
a
的内容

< C++ >在不同的上下文中也有不同的含义,例如

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

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

表达式
b=-a

指针是一个变量,它包含指向某个对象的地址。参考资料实际上是一个指针,它有一个漂亮的包装,图片中有大量的糖使它看起来美味可口。在里面,一旦你打开它,它也会做同样的事情

当他们将漂亮的包装放在指针周围以进行引用时,他们确实使引用变得更安全了,因为引用不能是
NULL
,所以在使用引用时,您不必检查是否有人使用“NULL”作为输入-指针可以是
NULL
,因此您必须首先检查这一点[或者不要,但它可能会崩溃-这不是很好…]

良好的封装意味着编译器知道为引用传递地址,如果您有指针,则必须确保它是传入的地址—或者使用指针变量作为参数,或者使用运算符的地址

我敢肯定,他们使用
&
作为“这是一个引用”的原因与“在此处传递地址,但将变量传递给函数时无需执行任何操作,编译器将为您进行修复”这一事实有关

声明指针时,使用
*
——这适用于函数的变量和参数


在其他地方,
&
表示“某物的地址”(将其变成指针),而
*
表示“该指针指向的内容”。同样,好的包装意味着使用引用时,
*
是隐藏的,但编译器会为您做这些事情。

我强烈认为您需要打开一些书,至少看一次。符号(&)和星号(*)做同样的事情,但只是他们看起来不同,他们做的事情也不同

首先,

指针,如您所知,是存储地址的数据类型,即其目的是指向另一个变量

参考资料-关于它们的两件事。 1) .引用只是它们所引用的对象/变量的另一个名称。 2) .References已被引入以克服指针不整洁和复杂的语法。请参阅两者的声明和用法

int  num = 45;
int* ptr = &num;
int& ref = num;
ptr和ref都指向num。请注意它们的语法以及它们的终止方式