C++编程实践—跨跃C和C++的指针

一、指针

指针的问题,是一个怎么谈都不过分的问题。我们应该怎么理解指针才能够更好的去掌握它、应用它?直白来说,指针象是一个物件的“把手”,如门的把手。通过把手可以操作门。如果从计算机的术语上来说,指针其实是一个变量,只是这个变量有些特别,它存储的是一个内存地址。通过这个变量,可以对内存进行各种操作。

二、C和C++中的指针

指针的名声很响,有褒有贬。但有一个不容置疑的情况是,C语言中有指针,号称高级的C++也有指针,这就说明了问题。指针就像一把双刃剑,既好用,又危险。指针能够穿越C和C++两大语言,并且在这么多年的应用里,在不断的指责声中一直屹立不动,肯定有其过人的本事。
大家都知道,效率和性能是C/C++的灵魂,如果没有了这个灵魂,它们早就在不断涌现的新的开发语言的历史大潮中被淘汰了。在前面的分析中,野指针、风险指针、智能指针、this指针、格式化指针…,针对指针的分析已经有很多了。这就说明指针的应用注意点太多了。对于初学者来说,一坑还没跳出,肉眼可见的几个坑已经出现。让人防不胜防。但这恰恰是指针施加于效率和性能上所带来的副作用。

三、指针应用的理念

想明白指针应用的理念,首先要明白指针为什么会出现?早期的编程,无论是顶层设计者还是开发者,都坚信一切必须掌握在开发者自己的手中。换句话说,C语言中,认为开发者是完全可信任的。不认为他们会搞一些奇奇怪怪的事情,更不可能使坏。这也正常,那个时候没有个人PC,没有现在的互联网,开发者都是一种精英的存在。
指针的方便、灵活赋予了开发者可以对硬件的全面掌控,管理内存,控制寄存器等等。这也是C语言之所以取代汇编语言的重要的基础之一。指针在面对内存时,它看到的是内存的地址代表的一系列的内存空间的大小。在此基础上,C++同样也延续了对C的兼容,并解决了使用指针操作对象的过程。不过,对于C++来说,指针更强调的是对内存的所有权和生命周期的管控。这也是C和C++语言对于指针应用上的明显区别。

四、指针为什么会长期存在

指针的实际应用中,问题不断。特别是随着互联网的兴起,原来的应用环境和场景一下子变化了太大。指针的灵活方便也让其被更加广泛的应用在实际的开发中,函数指针、多态等等。而此时指针的缺点也在被不断的放大,野指针、空指针特别是多线程下的异步访问等,都成为了C/C++程序异常、崩溃的主要原因。
可是C/C++标准中对指针的应用非但没有取消,甚至连限制都没有增加多少,只是在编程的规则里增加了一些对指针应用的规则。特别是C++,为了更好的应用指针,除了推出了RAII的方式,还不断尝试推出了智能指针。为了适应不同的场景还增加了几类智能指针。这是为什么呢?
需要明白的是,C/C++它其实是一种中间语言,并不是大家常说的高级语言。它的使命之一就是控制硬件,禁止了指针,也就失去了灵活控制硬件的手段。也就失去了语言的基础使命。其次就是庞大的历史延袭,导致指针在底层的广泛应用而无法抛弃(或者说成本不能接受)。基于这两点,C语言不用说,即使C++也只能在指针的基础上进行发展和完善(即推荐使用智能指针而非裸指针),而不可能去限制甚至废除它。
当然指针会长期存在,指针带来的问题也会长期存在甚至发展出新问题。典型的如指针边界的处理、指针类型的任意转换等,都是需要严格警惕的。但这也无法抵消开发者对指针的优点的垂涎。指针的这些缺点恰恰是在使用指针的优点时不能完全驾驭带来副作用,而这也是指针的生命能够从C语言延长到C++语言中的根本原因。
指针解决了函数与变量、类型与类型、对象与多态、内存管理和应用、硬件亲和、设计解耦等等很多方向上的问题。可以这样说,单单上刚刚提到的这些问题,几乎就涵盖了常见的大多数的应用开发。它既可以满足中规中矩的近按套路开发设计,又可以如瑞士军刀一样刺穿一切如“邪修”般进行开发设计。最让人又爱又恨的是,它还可以在关键时刻打破一切牢笼,从最底层直接操作程序,完成指定的任务。

五、总结

一些新的语言如Rust,号称解决了指针问题。但这种问题的解决也是有代价的。开发者总是在限制和灵活中求一个平衡,Rust是对取代C/C++中的指针的一个不错的选择,但未必是唯一的选择。
不过总得来看,指针的应用受约束是一个长期的目标。至于约束到何种程度,就得看制定标准的大佬们的思想激进到何种程度了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值