关于C++指针和参考,需要澄清

On C++ pointers and references, clarification needed

本文关键字:参考 C++ 指针 关于      更新时间:2023-10-16

请问下面有什么错?

我的理解是,指针表示某种类型的地址。

所以,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)错了?

void foo (int &something) // Will accept an address of something

这是不正确的:int&是一个引用,一个在某些方面类似于指针的概念,但根本不相同。

引用类似于指针,

因为值可以通过引用更改,就像可以通过指针更改一样。但是,没有"空引用"这样的东西,而 NULL 指针很常见。

当你调用一个接受引用的函数时,你只需将你正在接受的引用传递给变量 - 不需要&运算符:

void foo (something); // "something" must be a variable
声明

void foo (int &something)采用引用变量,而不是指针。

你调用它与调用void foo (int something)完全相同,只是something是通过引用传递的,而不是按值传递的。

void foo (int &something)//将接受某物的地址

不,虽然我能理解这种困惑。 该函数采用对int 的引用。 在定义良好的程序中,引用保证为非空。 它在概念上类似于指针,但在语义上不同。

要调用该函数,您无需执行任何特殊操作。

int i = 10;
foo(i);  // passed to foo by reference

因为C++ 在函数原型的上下文中,&表示"引用类型",因为您在此处使用它。您的职能:

void foo (int &something)

实际上指定应传递整数引用类型,因此您只需像这样调用此函数:

foo(i);

请注意,在这种情况下,您仍然将 i 的地址传递到函数中,但您将其作为引用类型而不是原始指针执行。

&有两种不同的含义

第一种是从现有变量创建指针。

二是做一个参考。

尽管它们都使用相同的字符,但它们是两个完全不同的东西。