当前位置:  开发笔记 > 编程语言 > 正文

为什么C++使用指针?

如何解决《为什么C++使用指针?》经验,为你挑选了6个好方法。

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



1> Alex Martell..:

你提到的所有其他语言(你忘记了,至少,Java !!!),虽然每个非常有用和可用,但是不要让你像C++(和C)允许的那样靠近机器:简单地放,所有这些语言强加给你更高的抽象水平......这可能主要是罚款,但以自己的方式偶尔会.

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

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


通常当我看到Alex回答问题时,我会阅读它以获得比我能提供的更好的答案.虽然我不是C++专家,但Alex的评论在他们所说的内容中是有根据的,他们不会 - 在我看来 - 提供正确的答案.答案很简单,而bluebrother已经说过了:从一开始,Stroustrup就把C++作为C的超集使其成为高优先级,因此C有指针,C++必须有它们.去年秋天,Stroustrup发表了这样的演讲:http://www.dcacm.org/archives/Lists/2008%20Events/Attachments/6/stroustrup_dc_acm_50th.pdf
"建议初学者远离FAR,远离权力和......并发症......"除了初学者也经常指出提供几乎同样困难概念的语言,如果不是指针提供的相同功能.
恕我直言,现在Pascal已经过时了,初学者最有用的可以从Python或Ruby开始(如果你在教育中"给他们早期轻松成功"阵营),D或C#或Java(更严格一点) ),或Haskell或SML(如果他们是数学专业;-) [或者可能是其他一些功能语言].我有一个长期的爱情故事与Scheme,但我理解为什么麻省理工学院放弃它为初学者支持Python ...
我在大学时学习了Pascal的指针,然后我在下一个课程中用于C实验室.然后在工作(我感谢每次我的前任老板!)我学习了C++.大学毕业后的第二年,他们将学习语言从Pascal改为Java ......我很高兴能在一年前出生:)

2> Nosredna..:

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

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


+1,还有一个响亮的AMEN! - 为什么一切都适合初学者?!
关于指针有什么难以理解的?即使在今天,程序员也知道指令和数据存储在可寻址位置的内存中,对吧?指针只是说明了位置.有什么难的?不过,我在C之前学过汇编语言.也许汇编语言程序员在学习C指针时有一个优势.
@RCIX.我们不应该有航天飞机.它们对初学者来说太难了.
对不起,但我真的不相信任何程序员在经过一些学习后无法理解指针的能力.这个概念真的不是那么难.
老实说,C++并不那么难.如果您正在编写代码,其中"当您最不期望它时,几乎任何事情都会爆炸",这更多地反映了您的编码能力低于语言.一个可怜的工匠责备他的工具.

3> bluebrother..:

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

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



4> David Anders..:

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



5> greyfade..:

这里有很多好的答案,但没有很多很好的例子说明为什么需要它....或者为什么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.



6> zvrba..:

您将指针算法与不可变指针,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++代码中会发生的情况.


+1最后,我会发布的答案 - "你正在使用指针,但你不知道它"
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有