以下是什么问题?
据我所知,指针代表某种类型的某个地址。
因此,int i = 18
,指向它的指针是int *pI = &i;
以下2个声明有效
void foo (int &something) // Will accept an address of something
void bar (int *something) // Will accept a pointer to something
当我们将函数声明为
时void bar (int *something)
我们最好发送指向某事物的指针。确实,foo(pI)
有效。
遵循相同的逻辑,看着
void foo (int &something)
我们应该发送一个指向int作为参数的东西的地址,然后:
为什么foo(&i)
错了?
答案 0 :(得分:5)
void foo (int &something) // Will accept an address of something
这是不正确的:int&
是一个引用,这个概念在某些方面类似于指针,但根本不相同。
引用类似于指针,因为可以通过引用更改值,就像可以通过指针更改一样。但是,没有“null引用”这样的东西,而NULL指针很常见。
当您调用带引用的函数时,您只需将变量传递给您正在使用的引用 - 不需要&
运算符:
void foo (something); // "something" must be a variable
答案 1 :(得分:2)
声明void foo (int &something)
需要reference variable,而不是指针。
除非void foo (int something)
为passed by reference,而非by value,否则您拨打的电话与something
完全相同。
答案 2 :(得分:0)
不,虽然我能理解这种困惑。该函数将引用带到void foo(int& something)//接受某个地址
int
。在定义良好的程序中,引用保证不为空。它在概念上与指针类似,但在语义上不同。
要调用该功能,您无需执行任何特殊操作。
int i = 10;
foo(i); // passed to foo by reference
答案 3 :(得分:0)
因为在C ++中,& 在函数原型的上下文中表示“引用类型”,因为您在此处使用它。你的职能:
void foo (int &something)
实际上是指定应该传递一个整数引用类型,所以你只需要调用这个函数:
foo(i);
请注意,在这种情况下,您仍然将 i 的地址传递给函数,但是您将其作为引用类型而不是原始指针。
答案 4 :(得分:0)
&
有两个的不同含义。
第一种是从现有变量创建指针。
第二个是参考。
尽管它们都使用相同的角色,但它们是两个完全不同的东西。