C++:使用指针的场景是什么?"好主意"(TM)?

aug*_*tin 16 c++ pointers

可能重复:
指针的常用用途?

我仍在学习C++的基础知识,但我已经足够了解有用的小程序.

我理解指针的概念,我在教程中看到的例子对我来说很有意义.但是,在实际层面上,作为(前)PHP开发人员,我还不自信在我的程序中实际使用它们.

事实上,到目前为止,我还没有觉得需要使用任何指针.我有我的类和函数,我似乎完全没有使用任何指针(更不用指针指针).我不禁为我的小程序感到有些自豪.

尽管如此,我知道我缺少一个C++最重要的功能,一个双刃:指针和内存管理可能造成破坏,看似随机的崩溃,很难找到错误和安全漏洞......但与此同时,如果使用得当,它们必须允许巧妙而有效的编程.

所以:不要使用指针告诉我我错过了什么.

什么是使用指针必须的好方案
他们允许你做什么,否则你不能这样做?
它们以哪种方式使您的程序更有效率?

那么指针指针呢?

[编辑:所有各种答案都很有用.SO的一个问题是我们不能"接受"不止一个答案.我经常希望我能.实际上,所有答案的组合有助于更好地理解整体情况.谢谢.]

Ben*_*ley 9

当我想让一个类访问一个对象时,我使用指针,而不给它该对象的所有权.即使这样,我也可以使用引用,除非我需要能够更改我正在访问的对象和/或我需要没有对象的选项,在这种情况下指针将为NULL.

  • 这是整个画面的简短版本.第一行正是为什么你要使用*references*而不是指针.当引用不起作用时,必须使用指针,这是一个较小的子集. (3认同)

Cra*_*rks 7

之前已经问过这个问题.我的回答是:

我在编写的C++代码中每六行使用一次指针.在我的头顶,这些是最常见的用途:

  • 当我需要动态创建一个生命周期超过创建范围的对象时.
  • 当我需要在编译时分配一个大小未知的对象.
  • 当我需要将一个对象的所有权从一个东西转移到另一个东西而不实际复制它时(比如链接列表/堆/任何非常大的,昂贵的结构)
  • 当我需要从两个不同的地方引用同一个对象时.
  • 当我需要切片数组而不复制它.
  • 当我需要使用编译器内在函数来生成特定于CPU的指令时,或者解决编译器发出次优或幼稚代码的情况.
  • 当我需要直接写入特定的内存区域(因为它有内存映射的IO).

  • ...必须使用指针代替引用的示例是:`int a,b,*c =&a; c =&b;`这不能用引用来实现,因为引用将在定义时绑定到"a",并且不能*重新设置*以便稍后引用"b".为了完成答案,使用指针的一个额外情况是将可选参数传递给函数,因为指针可以为null,但引用/值(非指针类型)不能. (2认同)

Mar*_*ler 6

指针通常用于C++.对它们感到满意,将有助于您了解更广泛的代码.也就是说,如果你可以避免使用它们,那么,随着程序变得越来越复杂,即使只是与其他库接口,你也可能需要它们.

  • 主要指针用于指动态分配的内存(返回new).

  • 它们允许函数接受无法复制到堆栈的参数,因为它们太大或无法复制,例如系统调用返回的对象.(我认为堆栈对齐也可能是一个问题,但是太自信了.)

  • 在嵌入式编程中,它们用于指代硬件寄存器之类的东西,它要求代码写入内存中非常特定的地址.

  • 指针还用于通过其基类接口访问对象.那就是我有一个派生自A类的B级class B : public A {}.这是一个对象B的实例,可以通过将其地址提供给指向A类的指针来访问,就好像它在A类中一样,即:A *a = &b_obj;

  • 在数组上使用指针作为迭代器是一个C语言.这在旧的C++代码中可能仍然很常见,但可能被认为是STL迭代器对象的不良表兄.

  • 如果你需要与C代码接口,你将不可避免地需要处理用于引用动态分配对象的指针,因为没有引用.C字符串只是指向由nul'\ 0'字符终止的字符数组的指针.

一旦你对指针感到满意,指针的指针似乎就不那么糟糕了.最明显的例子是参数列表main().这通常被声明为char *argv[],但我已经看到它(法律上我相信)宣称char **argv.

声明是C风格,但它说我有指向char的指针数组.这被解释为C样式字符串(由nul'\ 0'字符终止的字符数组)的任意大小的数组(大小由argc携带).

  • +1,但值得一提的是,引用可以完成很多工作并且更安全. (2认同)