2

说你有

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++ 函数:& 与星号 ,其中概述的代码几乎就是我上面写的。

在阅读了上面的线程和代码之后,似乎参数中的&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 
}

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

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

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

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

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

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

4

3 回答 3

5

之所以产生疑问,是因为在 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;

于 2013-05-25T08:56:19.457 回答
4

我强烈认为你需要打开一本书并至少通读一遍。与号 (&) 和星号 (*) 做同样的事情,但只是它们看起来不同,它们的工作方式不同。

开始,

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

参考 - 关于他们的两件事。1)。引用只不过是它们所引用的对象/变量的另一个名称。2)。引入了引用来克服指针的杂乱和复杂的语法。查看两者的声明和用法,

int  num = 45;
int* ptr = #
int& ref = num;

ptr 和 ref 都指向 num。请注意它们的语法以及它们取消引用值的方式。

cout<<*ptr;
cout<<ref;

现在你可以看到自己,有什么不同,什么看起来更干净......

-布佩什

于 2013-05-25T09:46:32.217 回答
2

指针是一个变量,它保存了某个东西的地址。参考实际上是一个指针,带有一个漂亮的包装和图片中的大量糖,使其看起来很美味。在里面,一旦你打开它,它就会做同样的事情。

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

良好的包装意味着编译器知道传递一个地址作为引用,如果你有一个指针,你必须确保它是一个传入的地址——要么使用指针变量作为参数,要么使用 address-of 运算符.

我确定他们使用&“this is a reference”的原因与“此处传递地址的位置,但在将变量传递给函数时不需要做任何事情,编译器将修复给你”。

当你声明一个指针时,你使用*- 这适用于变量和函数的参数。

在其他地方&表示某物的“地址”(将其变为指针),并*表示“此指针指向的内容”。同样,漂亮的包装意味着*在使用引用时隐藏在视图之外,但编译器会为你做这些事情。

于 2013-05-25T09:00:45.230 回答