为什么C++需要和使用指针?我知道他们为语言增添了力量,但是对于初学者来说,这让他们更难理解.像F#,Java,Ruby,Python,Lua等语言在没有它们的情况下就可以了,并且它们非常强大.
你提到的所有其他语言(你忘记了,至少,Java !!!),虽然每个非常有用和可用,但是不要让你像C++(和C)允许的那样靠近机器:简单地放,所有这些语言强加给你更高的抽象水平......这可能主要是罚款,但会以自己的方式偶尔会.
C++是一种更大,更复杂的语言,因为它允许在相同语言中以非常低的抽象级别(非常接近机器)和非常高的级别(接近你提到的许多语言)进行编程,实际上在相同的源中文件.
建议初学者保持FAR远离这种功率和(不可避免的)复杂性 - 但不是每个程序员都是初学者,并不是每个代码都需要(或者,实际上,可以完全站立! - )环境"让我们保护自己可怜的自己"作为一个主要的设计目标! - )
也许C++不适合初学者.
指针已存在很长时间了.他们在Pascal和C.当C++出来时,它会在没有指针的情况下丢失.
我还没有在这里读过的一个原因:
C++的设计与C的兼容性是一个目标,所以简单地说C++是C的超集(这不是100%真实,但差不多).由于C确实有指针(并且由于它的低级性质需要它们),C++也需要支持它们.
C#有指针,如果没有它们我就无法接受.这完全取决于你在做什么,学习指针对你作为开发人员非常有用.问题不是为什么,何时使用它们.
这里有很多好的答案,但没有很多很好的例子说明为什么需要它....或者为什么C有时被称为"便携式汇编语言".
在机器的最低抽象级别上,存在通过存储器范围访问的大量硬件功能.这些存储器地址通常使用各种类型的硬件非常标准化.
例如,当x86计算机首次启动并且BIOS已加载并启动引导扇区时,CPU处于称为"16位实模式"的模式,用于存储器寻址.要访问硬件外围设备,有几种方法,包括内存区域和IN和OUT汇编指令.可在存储器地址范围0xA0000-0xBFFFF访问视频.写入此存储位置将在屏幕上绘制字符.写入0xC0000以上的某些区域会操纵视频BIOS寄存器,例如,可以更改视频模式.
C最初是为了将UNIX移植到PDP-11而创建的,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.
您将指针算法与不可变指针,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()改变了yz的值,这正是用指针编写的相应C或C++代码中会发生的情况.