“指针”是成熟的编程语言必须具有的概念吗?

https://segmentfault.com/q/1010000003797714

我在看一个日本人写的书《征服 C 指针》,书上的引言提到这么一句话

确实,“C指针”有着底层而邪恶的一面,但是,它又是构造链表和树等“数据结构”不可缺少的概念。如果没有指针,我们是 做不出像样的应用程序的。所以,凡是真正成熟的开发语言,必定会存在指针,如Pascal、Delphi、Lisp 和Smalltalk 等,就连Visual Basic 也存在指针。 早期的Perl 因为没有指针而饱受批评,从版本5 开始也引入了指针的概念。 当然,Java 也是有指针的。很遗憾,世上好像对此还存有根深蒂固的误解。

在本书中,我们将体验如何将指针真正地用于构造数据结构。

“指针”是成熟的编程语言必须具有的概念。

它上面提到的这些语言我都没有学过,但是根据我学过的 JavaScript,Python 和 Ruby,它们都是没有指针的啊,这是怎么回事呢?难道是作者错了,还是我理解有问题呢?

指针的本意是:在一个变量中保存另一个变量的地址,以提供将“地址”变量化的能力。如果没有指针,将无法用一个变量引用另一个变量(只能把变量的值拷贝一份赋给另一个变量)。

C语言中提供了完善的指针操作,包括为指针赋值、内存分配(malloc)、取变量地址、让指针可以参与运算等,这使得C程序员能够任意操作可用内存。

JavaJavascript)中也有指针,只不过与C相比,Java对程序员使用指针有着严格的限制,仅允许赋值操作,而且不是任意值,只能是通过new创建的对象引用或其他引用变量的值。不过Java一般不说指针,而是用引用reference)来称呼指向对象的指针,不过,Java中仍然可以找到一些指针存在的影子,例如,当一个对象为null时调用方法会导致null pointer异常,即所谓的空指针错误,可见Java内部使用的确实是指针。

很多基本的数据结构,例如链表、树、图等,都必须用指针来保存前驱或后继节点的地址,否则这些数据结构无法实现。

如果一个语言不提供指针,虽然在理论上它也具备完整的计算能力,但很多在其他语言中非常简单的问题都将变得极其复杂(本来想举个例子的,但一时想不起了,不过这个结论肯定是正确的)。

所以这个作者说的是对的,只是你需要理解指针的本质,不要错误地认为只有像C语言那样的指针才叫指针,真正的指针的概念请看我开头的那句。

没看过那个作者的书 但java里面叫引用 和指针还是有区别的 并不能直接操纵内存
个人理解指针的存在是为了获得运行时的效率和底层访问的能力 然而对于一个成熟的编程语言 这两个在现在看来并不是必须的特性 而开发效率 解决特定问题的能力等也是重要的考量

首先,c语言的指针和其他语言的指针有本质区别。c语言的指针是可以任意赋值,任意解引用的指针,其他语言是阉割过的,很难自由使用

其次,c语言的指针用于操作底层,实际上它是一门介于高级和汇编之间的语言才有的特征。个人认为,c++的指针完全是为了兼容c才做出的保留,在c++11的编程规范中已不提倡使用。

你肯定没搞过单片机,在单片机上我恨不得用汇编……(特别是在逻辑不复杂的情况下)
C的指针是对“底层可操作性”的一种妥协,至于其他童鞋说的 ‘将“地址”变量化的能力’ 那个就不是C中狭义的“指针”了,毕竟引用是不能随便在内存地址空间上瞎JB移动了(对于单片机这样和硬件打交道比较多的平台,这是好事,但是如果专注于较高层次的逻辑的话,这是坏事,因为你的注意力经常要被野指针、内存泄漏等等坑爹的事情给吸引过去)
所以,在拥有合适工具(比如Java的引用+GC,C++11的智能指针)并且不需要直接和硬件打交道的场景下,还是尽量不要用指针比较好

时间: 2024-11-07 00:01:23

“指针”是成熟的编程语言必须具有的概念吗?的相关文章

指针知识梳理1-变量基本定义及使用

一.指针变量.地址.数据.内存关系 在学习指针之前,我们先统一几个概念. (1)在计算机中本质 用 内存 来存储 数据 ,在我们写代码的时候,用变量来存储数据 . (2)变量是在编程语言中的概念,方便我们编程,当编译运行起来以后,就只有内存了和数据了. 比如 当 我们写代码 int a; int b; a = 1; b = a; 第1行第2行,语法层面是 定义两个变量,计算机层面是在内存中申请 2个4字节内存,a地址 0x10,b地址  0x0c 第3行,语法层面是 给变量a赋值1,计算机层面是

[C++常见面试笔试题汇总] 程序设计基础 - 内存分配、sizeof、指针篇

2 内存分配 系统蓝屏,很大原因都是系统自身代码有缺陷引起的,而系统代码缺陷很大程度上与内存分配不当有关.由于内存分配不当引起的堆栈溢出.缓冲区溢出等问题,常常会导致系统瘫痪甚至崩溃,所以理解内存分配对于一名合格的程序员而言非常有必要. 2.1 内存分配的形式有哪些? 一个C/C++编译的程序所占用的系统内存一般分为以下几个部分的内容: (1) 由符号起始的区块(Block Started by Symbol, BSS)段:BSS段通常是指用来存放程序中未初始化的全局数据和静态数据的一块内存区域

【转】让你不再害怕指针——C指针详解(经典,非常详细)

前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析.下面让我们先从简单的类型开始慢慢分析吧: [cpp] view plain copy int p; //这是一个普通的整型变量 int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,

指针的本质---如何确定指针的类型

前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍 一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一 个类型里会出现很多运算符,他们也像普通的表达式一样,有优先 级,其优先级和运算优先级一样,所以我总结了一下其原则: 从变量名处起,根据运算符优先级结合,一步一步分析. 下面让我们先从简单的类型开始慢慢分析吧: int p; int *p; //这是一个普通的整型变量 //首先从 P 处开始,先与*结合,所以说明 P 是一 //个指针,然后再与 int 结合,

C语言-->(十)指针基础

知识点: 1.指针基础 2.指针和函数(地址传递) ======================================= 指针是C中的一个重要的概念,也是C的一个重要特色.掌握指针的应用,可以使程序简洁.紧凑.高效. 指针的概念比较复杂,使用也比较灵活,因此初学时会常出错,我们要理解每一个概念的本质,多加练习,在实践中掌握它. 程序使用指针和没有没有使用指针的代码是两个档次. ========================================指针基础 [地址概念] 1.生

[转]C 语言指针的使用

第一章 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让 我们分别说明. 先声明几个指针放着做例子: 例一: (1)int *ptr; (2)char *ptr; (3)int **ptr; (4)int (*ptr)[3]; (5)int *(*ptr)[4]; 如果看不懂后几个例子的话,请参阅我前段时间贴出的文?lt;<如何

1.1 初识指针

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让我们分别说明. 先声明几个指针放着做例子: 例一: (1)int*ptr; (2)char*ptr; (3)int**ptr; (4)int(*ptr)[3]; (5)int*(*ptr)[4]; 1.指针的类型 从语法的角度看, 你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的

C指针的解析

这是我从网上转载的一篇关于C指针的文章,方便自己以后回顾,自己添加修改部分内容 ,不对请指正 Attention:指针是指针变量 ,数组是指针常量 第一章 指针的概念  指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: (1)指针的类型 (2)指针所指向的类型 (3)指针的值或者叫指针所指向的内存区 (4)指针本身所占据的内存区. 先声明几个指针放着做例子: 例一: (1) int *ptr; (2) char *ptr; (3) i

150809234 赵帅 (指针)

1.指针与数组 指针通常指向一片储存空间,而开辟的储存空间地址为指针的量:数组开辟的是一段连续的内存空间,而指针则是单一特定内存地址,因此两者不可互相转换. 数组变量可以赋值给指针(即将数组第一个变量的地址赋予指针). 2.动态内存分配与静态内存分配 (1)动态内存分配 根据程序的需要开辟空间,不需要预先分配,智能自动,可以根据需要增大或减小. (2)静态内存分配 即预先分配好储存空间,缺点显而易见,需要预先知道数据的大小,修改数据的时候需要更改已经分配好的储存空间,浪费内存等. (3)函数 v