为什么C ++使用指针?

时间:2009-07-04 04:48:50

标签: c++ pointers

为什么C ++需要和使用指针?我知道他们为语言增添了力量,但是对于初学者来说,这让他们更难理解。像F#,Java,Ruby,Python,Lua等语言在没有它们的情况下就可以了,它们非常强大。

13 个答案:

答案 0 :(得分:55)

你提到的所有其他语言(你忘记了,至少是Java !!!),虽然每个语言都非常有用和可用,但是不要让你像C ++(和C)所允许的那样靠近机器:简单地说:把所有这些语言强加给你一个更高层次的抽象......这可能主要很好,但偶尔妨碍你。

C ++是一种更大,更复杂的语言,因为它允许在相同语言中以非常低的抽象级别(非常接近机器)和相当高的级别(接近你提到的许多语言)进行编程,实际上是在相同的源文件。

建议初学者保持FAR远离这种功能和(不可避免的)复杂性 - 但每个程序员都不是初学者,而不是每一个代码都需要(或者,实际上,可以在站立! - )在一个环境中“让我们保护自己可怜的笨蛋”作为一个主要的设计目标! - )

答案 1 :(得分:26)

也许C ++不适合初学者。

指针已存在很长时间了。他们在Pascal和C.当C ++出来时,它会在没有指针的情况下失去大门。

答案 2 :(得分:17)

我还没有在这里读过的一个原因:

C ++的设计与C的兼容性是一个目标,所以简单地说C ++是C的超集(这不是100%真,但差不多)。由于C确实有指针(并且由于它的低级性质需要它们),C ++也需要支持它们。

答案 3 :(得分:12)

C#有指针,如果没有它们,我就不能得到。这完全取决于你在做什么,学习指针对你作为开发人员非常有用。问题不是为什么,何时使用它们。

答案 4 :(得分:11)

这里有很多好的答案,但没有很多很好的例子说明为什么需要。 ...或者为什么C有时被称为“便携式汇编语言”。

在机器的最低抽象级别上,存在大量通过内存范围访问的硬件功能。这些内存地址通常使用各种类型的硬件进行了非常标准化。

例如,当x86计算机首次启动并且BIOS已加载并启动引导扇区时,CPU处于称为“16位实模式”的模式,用于存储器寻址。要访问硬件外围设备,有几种方法,包括内存区域和IN和OUT汇编指令。可在存储器地址范围0xA0000-0xBFFFF访问视频。写入此存储位置将在屏幕上绘制字符。写入0xC0000以上的某些区域会操纵视频BIOS寄存器,例如,可以更改视频模式。

最初创建C是为了将UNIX移植到PDP-11,后者使用类似于x86的内存映射I / O方案。如果没有指针,UNIX就永远不会在PDP-11上运行。

如果不修改核心语言,F#,C#,Ruby,Python,Lua等语言就无法做到这一点。 C和C ++可以:

/* Assuming 16-bit DOS environment, 80x25 character video mode. */
char* video = 0xA0000;
video[1] = 'H';
video[3] = 'e';
video[5] = 'l';
video[7] = 'l';
video[9] = 'o'; /* prints "Hello" in the top-left corner of the screen.

答案 5 :(得分:10)

您将指针算法与不可变指针,AKA,引用混合在一起。所有这些语言,包括你没有提到的Java,都有引用。引用的功能稍微弱于指针,但在进入需要指针算法或双指针或三指针的阶段之前,您不会注意到这一点。但是,在引擎盖下,引用 与指针完全相同,只是语言不会让你做任何你想做的事情(即,它们不是一流的对象)。

考虑这个python代码:

class X: z=13

y=X()
def f(aa): aa.z = aa.z+1

print(y.z)
f(y)
print(y.z)

f()改变了y.z的值,这正是用指针编写的相应C或C ++代码中会发生的情况。

答案 6 :(得分:4)

简而言之,因为C ++以系统编程为目标。

这意味着C ++的定位是从上到下实现几乎所有内容。

这包括操作系统,您需要对机器地址下发生的事情进行一定程度的控制,而不仅仅是VM映射的逻辑地址。

这还包括C ++或任何其他语言的编译器,这需要实际实现这些语言使用的抽象。

这还包括性能受限的设置,例如嵌入式设备编程或高性能计算,其中必须以非常小心地使用内存,指令,代码大小和任何其他受约束资源的方式进行编程。 / p>

不是很多语言针对这些广泛的任务。调用这个标准强大的其他语言是相当误导的,因为这些语言根本不适合这些任务。

答案 7 :(得分:4)

  

为什么C ++需要并使用指针?

C ++不需要任何东西。程序员需要它们,并且有真正需要它们的程序员。就像构建设备驱动程序的程序员一样。

因此,必须是允许原始内存访问的某些语言。 C ++ 发生是其中一种语言。

答案 8 :(得分:1)

指针提供了一种通过引用传递的方法,这在一些传递大型数据结构的程序中至关重要。你只需传递一个小指针,而不是传递100mb。没有“指针”的语言通常有一种通过引用传递的机制。

答案 9 :(得分:1)

大多数高级语言本身没有指针,但它们确实使用类似的结构。这是一个例子。在C ++中,如果你有类似的东西:

Foo myObject();

你已经声明了一个Foo的实例,它总是属于Foo类型。您不能声明Foo并在不使用指针的情况下实例化其他类型。但是,在C#中,您可以轻松完成:

Foo myObject = new Bar(); // assuming Bar derives from class Foo

在C ++中执行此操作的唯一方法是使用指针(并且由于多态性)。 C#正在使用各种指针,但是抽象出使指针变得“难以”使用的混乱内容。

答案 10 :(得分:1)

你可以在不使用指针的情况下在C ++中做很多事情。坚持参考和更高级别的东西,如STL。阅读加速C ++是一个优秀的初学者(虽然有人用另一种语言编程)的书。 C ++可以以比C更高的方式编程。远离多重继承,编写自己的模板和指针,你会没事的。如果您刚刚开始,请从开始学习虚拟功能和面向对象编程。远离超载。获得前50%的语言和难以学习的额外50%似乎不那么令人不安。

答案 11 :(得分:0)

这个问题可以引发严重的火焰战争。 我一遍又一遍地问自己同样的事情,同时试图了解指针和c ++中所有相关的东西

在诸如ruby,python和其他语言之类的原因语言的另一个级别上。它们离机器语言更加抽象。但也许更慢。

另一个原因是c ++是一种非常古老的语言。很多概念都是人们不知道的更好,我认为这是一个严重的问题。 C ++有它的优点,它可以让你编写非常快的代码并采取很好的快捷方式。但是这种权衡是一种难以理解的语言,看起来像艺术的程序却让后来使用它的人感到困惑。

答案 12 :(得分:0)

对于某些使用C ++的环境,假设垃圾收集(GC)开销太大,例如:嵌入式系统,操作系统。对于高级引用,如果仍可访问对象,则无法删除该对象。 GC的存在假设使得安全保证成为可能。如果不采用GC作为基本假设,C ++将始终需要原始指针。

不出所料,本网站上最受欢迎的C ++问题之一是“如何以一般方式解决悬空指针问题?”,最流行的答案是使用引用计数智能指针,这是就像一个穷人的GC。另一个答案是使用正确的工具来完成工作 - 如果不是进行低级或嵌入式系统编程,C ++可能是错误的工具。 C ++在高级应用程序编程中的应用范围远远超出其应有的范围。很多人都在浪费时间来调试内存泄漏,内存损坏等等,因为他们正在使用错误的工具来完成工作。

使用指针的另一个原因是它们允许设备驱动程序的作者寻址特定的内存区域,这在与设备通信时通常很有用,因为某些内存区域“映射”到硬件设备。但同样,这是一个非常低级的系统编程问题。