函数的指针参数

时间:2013-12-16 22:16:08

标签: c++ pointers

我无法理解的一件事是何时在函数中使用某些类型的指针作为参数。

考虑一个接收整数作为参数的函数,并将该值加倍。其功能可能是:

void doubleTheValue(int *myNum)
{
    *myNum *= 2;
}

int main()
{
    int number = 2;

    doubleTheValue(&number);

    // prints 4
    cout << number << endl;

    return 0;
}

这对我有意义。该函数接收一个整数指针,并传入对变量'number'的引用,并更改该值。现在,令我困惑的是,如果你这样做了:

void doubleTheValue(int &myNum)
{
    myNum *= 2;
}

int main()
{
    int number = 2;

    doubleTheValue(number);

    // this also prints 4
    cout << number << endl;

    return 0;
}

请注意该函数的参数不同。这究竟是在内部做什么,为什么你会在上述方法中使用它?

4 个答案:

答案 0 :(得分:2)

  

这在内部究竟是做什么的,为什么你会在上述方法中使用它?

&引用将被读作指针引用参数的等价,但

  1. ...保证初始化
  2. ...无需使用指针解除引用运算符*来访问函数实现中的值/成员
  3. 要指示传递参数的错误条件,您需要使用返回值类型(不是void),或者从函数内部引发异常。这通常适用于两种变体。

答案 1 :(得分:2)

  

这在内部究竟是做什么的,为什么你会在上述方法中使用它呢?

在你的第一个例子中:

void doubleTheValue(int *myNum)
{
    *myNum *= 2;
}

您正在传递指向该函数的指针。指针具有实现定义的大小。例如,在64位体系结构中,指针的大小可能为8字节。在这种情况下(通常,对于基本类型),传递指针而不是引用会产生反效果(参见下一段)。

在你的第二个例子中:

void doubleTheValue(int &myNum)
{
    myNum *= 2;
}

您正在传递对该函数的引用。主要区别在于甚至根本不需要引用来占用任何内存。 myNum和原始变量只能在内存中共享同一个对象。

对于引用和指针之间的其他差异,我建议您查看this question。但一般的经验法则是,尽可能使用引用。您将发现在特定情况下需要使用指针(例如,当您想要接受空值时)。

答案 2 :(得分:1)

您应该了解指针和引用之间的区别。在许多情况下,我们无法使用我们可以使用指针进行的引用来做某事。尽管引用不需要任何内存,但它们只是内存位置的标记,但与指针相比,指针远比引用更强大。 主要区别是:

1-指针可以重新分配任意次数,而初始化后无法重新分配引用。

2-A指针可以指向NULL,而引用永远不会指向NULL。

3 - 您无法使用指针

获取引用的地址

4 - 没有“参考算术”(但您可以获取参考指向的对象的地址并对其进行指针算术,如&amp; obj + 5)

答案 3 :(得分:0)

来自OP,原帖子的评论:

  

这两者都没有真正对应用程序有任何用处,也没有解释为什么你会使用其中一个而不是我很好奇的。

我的印象是人们大多使用引用,因为它们使代码看起来更干净,因此没有很多*&浮动。