关于c ++:为什么有指针参数?

Why have pointer parameters?

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

Possible Duplicates:
Why use pointers?
Passing a modifiable parameter to c++ function

为什么要有指针参数?我能看到的唯一原因是小函数试图减少混乱和较小的内存占用。


在将一个可修改的参数传递给C++函数时,我回答了何时使用引用而不是指针。

相反,如果以下任何一项为真,则首选指向引用的指针:

  • 它可以是空的。
  • 它可以被改变(指向别的东西)
  • 必须删除

有些人也喜欢指针,当指向的东西应该被变异时,说一个const引用和一个非const引用之间的差异对读者来说不够明显。


  • 与引用不可用的C代码兼容。
  • 可变大小的数组。
  • 选项缺少参数,即空。

  • 指针是接受C样式字符串和数组的唯一方法。它们也是在多个线程之间共享数据的唯一方法(除了全局对象,这些对象…电子战)。


    原因有二:

  • 32位平台上的指针只有4个字节。如果传递给函数的数据超过4个字节,则通过通过引用而不是按值传递结构来节省一些调用时间。(稍后您可能会在间接成本方面放弃这种性能优势,但这正是进行分析的原因。)

  • 可以传递一个非常量指针,让函数修改传递的数据。


  • 有很多原因可以使用指针作为参数。一个主要原因是多态性。指针可以指向基类对象或子类,并相应地调用该对象上的方法。

    我推荐凯尼格加速C++,他很好地解释了多态是如何通过指针(和引用)在C++中工作的。


    如果将一个简单变量传递给一个函数,该函数将创建该变量的副本,以在函数的作用域内使用。当函数完成执行时,不会显示对传递的简单变量所做的任何更改。这是因为变量本身从来没有在函数中被更改过,只是它的一个副本。将指向变量的指针传递给函数可以解决这个问题。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    int some_function(int num) {
       return num++;
    }

    int num1 = 15;

    std::cout << some_function(num1) << std::endl; //prints 16

    std::cout << num1 << std::endl; //prints 15


    我想你的意思是和参考文献相反?您可以对指针执行的操作是将它们设置为空,这允许您指定未初始化的状态。这有时是有用的,但其必然结果是,如果要强制执行不能将空值传递给函数,那么使用引用可以清楚地说明这一点。


    除了指针参数的标准用法(其他人已经说过),我能想到的一个原因是实现回调。您可以拥有一个接受函数指针作为参数的函数。


    指针和引用之间还有一个区别:-指针可以是空指针-引用引用始终是一个真实的对象[F(T&V);F(空);不是很好的主意]


    有很多原因,但参考文献应该是"标准"。仅当引用不起作用时才使用指针。一些利弊:

    • 指针可以有空值,这是非常有用的
    • 指针可以是泛型类型,并且可以重新解释为其他类型(尽管您不敢使用void*)
    • 指针可以用来传递没有巨大内存占用的大型数组

    • 对于泛型类型,编译器优化可以操作最好是参考文献,因为编译器有更多关于所用的信息类型

    • 可以说,引用可以生成代码更可读,更符合Java和C,因此通过其他类型的开发人员

    • 引用不会实际传递整个对象,而不是指针但更多类型信息对编译器可用。


    IMO,指针在很多C++文档中都比它们实际要重要得多,而在介绍性材料中很少提及引用(除了参数方面的简短提及)。

    虽然指针当然有值(数组、字符串、动态内存等),但它们的许多功能可以通过引用更简单地实现。我唯一一次真正定期使用指针参数是在使用内置有这种用途的第三方库时。

    使用引用删除了直接类参数中隐式的复制赋值步骤,而不需要反复地消除令人厌烦的指针引用(使用*或->)。此外,学习使用引用对于诸如运算符重载之类的应用程序很重要,这对于代码的精确控制至关重要。