关于c ++:函数的指针参数

Pointer arguments for functions

本问题已经有最佳答案,请猛点这里访问。

有一件事我无法理解,那就是什么时候在函数中使用某些类型的指针作为参数。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void doubleTheValue(int *myNum)
{
    *myNum *= 2;
}

int main()
{
    int number = 2;

    doubleTheValue(&number);

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

    return 0;
}

这对我来说是有意义的。函数接收一个整数指针,然后传入对变量"number"的引用,它将更改该值。现在,让我困惑的是,如果你改为这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void doubleTheValue(int &myNum)
{
    myNum *= 2;
}

int main()
{
    int number = 2;

    doubleTheValue(number);

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

    return 0;
}

注意,函数的参数不同。这究竟是在内部做什么,为什么要在前面提到的方法上使用它呢?


What exactly is this doing internally, and why would you use it over the aforementioned method?

在第一个示例中:

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

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

在第二个示例中:

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

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

关于引用和指针之间的其他区别,我建议您看看这个问题。但一般的经验法则是,你可以随时使用引用。您将发现在特定情况下(例如,当您想要接受一个空值时)需要使用指针。


What exactly is this doing internally, and why would you use it over the aforementioned method?

&引用将作为指针引用参数的等效项读取,但是

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

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

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

    2-指针可以指向空,而引用不能指向空。

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

    4-没有"引用算术"(但您可以获取引用指向的对象的地址,并在其上执行指针算术,如&;obj+5中所示)


    从操作开始,在原始帖子的评论中:

    Neither of this really give any use for applications nor explain why you would use one over the other which is what I am curious about.

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