【问题标题】:Pointer arguments for functions [duplicate]函数的指针参数[重复]
【发布时间】:2014-01-04 12:00:53
【问题描述】:

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

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

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;
}

注意函数的参数是不同的。这在内部到底是做什么的,为什么要在上述方法上使用它?

【问题讨论】:

标签: c++ pointers


【解决方案1】:

这在内部到底是做什么的,为什么要在上述方法上使用它?

在你的第一个例子中:

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

您正在传递一个指向函数的指针。指针具有实现定义的大小。例如,在 64 位架构中,指针的大小可能为 8 字节。在这种情况下(通常,对于原始类型),传递指针而不是引用会适得其反(参见下一段)。

在你的第二个例子中:

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

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

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

【讨论】:

    【解决方案2】:

    这在内部到底是做什么的,为什么要在上述方法上使用它?

    &amp; 引用将被视为指针引用参数的等价物,但是

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

    【讨论】:

    • 3. ...在调用站点上没有关于将此参数传递给函数是否会对调用后变量的值产生影响的信息。
    • @Andrey 因为调用端看不到函数原型?
    • @juanchopanza 确定你可以看到函数原型,但是如果你正在扫描代码,你想搜索一堆标题来尝试找到它吗? (是的,bla bla 我知道 IDE 让这变得更容易。)
    • @H2CO3 但是一旦你传递了一个指针,你必须去查看函数的 body 看看它是否需要一个指向单个元素的指针,或者第一个元素数组。或者它可能假设一个指向动态分配的对象(或数组)的指针,然后它会取消分配......
    • @juanchopanza 不过,这不是重点。如果您使用引用,则永远无法从语法中确定对象是否被函数修改。但是,如果只允许按值和按指针传递参数,那么您可以确保foo 在按值传递时肯定不会被修改,如bar(foo)。因此,推理程序的行为会更容易(是的,我遇到过函数式程序员)。当然,如果是通过指针传递的(bar(&amp;foo)),那么它可能会被修改也可能不会被修改,但这已经超出了范围。
    【解决方案3】:

    您应该了解指针和引用之间的区别。在许多情况下,我们不能使用引用来做一些事情,而我们可以使用指针来做。虽然引用不需要任何内存,它们只是内存位置的标记,但与指针相比,指针比引用强大得多。 主要区别在于:

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

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

    3-你不能像使用指针那样获取引用的地址

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

    【讨论】:

      【解决方案4】:

      来自 OP,在原始帖子的 cmets 中:

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

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

      【讨论】:

      • 哈哈@downvote。查看有关该主题的其他帖子,以及 cplusplus.com 上的 C++ 常见问题解答。他们说更喜欢引用而不是指针,但实际上并没有给出任何理由,而提倡这种做法的 StackOverflow 回复引用了该常见问题解答,该常见问题解答也没有给出任何理由!
      • 这不太对,我认为您的回答也没有抓住重点。 C++ 人通常更喜欢引用,因为他们认为指针很危险。
      • 虽然“指针很危险”的说法是最经得起严格审查的说法是对的,但我认为引用的 reason 可能仍然是正确的在代码中如此普遍的是语法更漂亮,即使它的信息量较少。
      猜你喜欢
      • 2014-07-16
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 2016-05-03
      • 1970-01-01
      • 2018-08-24
      相关资源
      最近更新 更多