3
int y=5;
int *yPtr = nullptr;
yPtr = &y;

我知道指针存储了y的地址。并调用 *yPtr 取消引用 y。

如果我调用了 void 函数:

int main()
{
    int number = 5;
    function( &number );
}

void function( int *nPtr)
{
    *nPtr = *nPtr * *nPtr;
}

如果函数将指针作为参数,那么对函数的调用如何使用地址?我知道 nPtr 存储地址,但为什么不能将其定义为。

void functions (int &ref)
{
    ref = ref * ref;
}

我的主要问题是:为什么接收地址参数的函数需要指针参数来接收地址?

4

3 回答 3

4

通过使用传递引用参数,您强制您的函数不是复制参数本身的值,而是使用您提供的实际变量。因此,要获得更清晰的视图,请参见下文:

void function( int number )
{
  cout << number;
}

function( myInt ); // function will copy myInt, into its local variables stack

但是,通过使用传递引用的方法,像这样:

void function ( int & number )
{
  cout << number
}

function( myInt ); // function will not copy myInt into its local variables stack, instead, it will use the already existent myInt variable.

编译器如何使用传递指针和传递引用参数没有区别。相反,您的函数调用将如下所示:

void function_p( int *number )
{
  cout << *number;
}

void function_r( int & number )
{
  cout << number;
}

// and the calls

function_p( &myInt ); // it is required to use address-of operator here
function_r( myInt ); // the effect will be the same, but with less effort in writing that address-of operator

在 C++11 中,程序员开始使用 pass-by-reference 方法,一般来说,通常是因为它更容易编写“模板”。


为了完成您的问题的答案,*and&运算符仅引用参数的类型,以便它们创建复合类型。复合类型是根据另一种类型定义的类型。C++ 有几种复合类型,其中两种是引用和指针。

你可以理解它们只影响变量的类型(在我们的例子中,参数),通过以正确的方式编写它们:

int* p1; // we will read this: pointer p1 points to an int
int* p2 = &var1; // we read this: pointer p2 points to int variable var1

int var1 = 12;
int& ref1 = var1; // and we read this: ref1 is a reference to var1

您通常可以认为引用表示同一块内存的不同引用。

于 2014-03-06T07:34:26.513 回答
0

你的意思是

void functions (int &ref)
{
    ref = ref * ref;
}

这就是你使用 refs 的方式,避免所有 '*' 的指针语法

于 2014-03-06T07:29:50.923 回答
-1

这是 C++ 的另一个古怪之处。通过引用传递与传递指针不同。当你做类似的事情时

void functions (int &ref)

您可以将实际变量传递给functions(而不是指向它们的指针),例如

int a = 12;
functions(a);

在函数内部,您无需取消引用。请注意,您是通过引用传递,而不是传递引用

当您传递引用或指向某物的指针时,您使用星号

void function( int *nPtr)

因此你必须取消引用 *

另请注意,您通过在变量(或常量)前面放置来获取对变量(或常量)的引用&,但通过在其前面放置 a 来声明引用或指针*。同时,您也可以通过在指针*前面放置一个指针来取消引用它。

于 2014-03-06T07:36:00.013 回答