【问题标题】:Did languages before C/C++ have pointers?C/C++ 之前的语言有指针吗?
【发布时间】:2011-03-18 13:32:10
【问题描述】:

在 FORTRAN(Fortran-90 之前)、cobol 或 pascal 等旧语言中是否使用过指针? 如果不是,那么那些语言用来实现当今高级语言中使用的指针所做的工作的方法是什么。

而且由于java中没有指针 有没有其他方法可以 复制指针所做的工作。

【问题讨论】:

  • pascal 确实有类似p^ 的指针,你可以用数组和索引做任何事情。无法抗拒,所以编辑:正如所有真正的程序员都知道的,唯一有用的数据结构是数组。字符串、列表、结构、集合——这些都是数组的特殊情况,可以很容易地以这种方式处理,而不会因各种复杂情况而弄乱你的编程语言。花哨的数据类型最糟糕的是你必须声明它们
  • @bestsss 真正的程序员不知道链表?
  • @Lundin,您可以实现一个仅包含一个数组的链表。甚至,Jerry Coffin 解释了他是如何在 fortran 中实现链表的。
  • @Lundin,确保您可以解决各个字节/单词/夹头,它们只是乱序。想象一下,您需要 contains(xxx) 或 hash()/sum(),您不必以连续的方式对数组进行寻址以获得正确的结果。仅当您需要订购数据时,链接的属性才会有趣(这是通常的情况,但仍然如此)。要点是:该数组在没有排序索引的情况下仍然有用。至于数组的定义:我想它对于 RP 来说太窄了:)
  • @Lundin:我希望你可以用一个数组来实现一个链表,因为你的整个内存空间就是:一个字节数组。

标签: c pointers fortran implementation pascal


【解决方案1】:

Algol 68 的引用很像 C/C++ 指针。

Pascal 有指针,但你不能对它们进行算术运算。

PL/我有指针。

在 FORTRAN 和 COBOL 中,您大部分时间都没有使用语言编写的动态分配之类的东西。我曾经在 FORTRAN 中编写了一些使用数组的链表代码,数组索引作为“下一个”项的链接(即 x[1] 是一个数据项,x[2] 是它到下一个数据项,x[3] 是另一个数据项,依此类推)。称其为“笨拙”几乎是过分的慷慨。

【讨论】:

  • 我从 Pascal 学习了如何使用指针。到那时我已经精通四种汇编语言这一事实​​可能有所帮助。
  • @David,同样,我在 pascal 中学习了指针和 OO,但了解一些汇编语言确实有帮助。实际上,我对 C 中的本机指针算法感到非常惊讶。
  • 我在大学的数据结构课是使用 Fortran 77 教授的,我们也做了同样的事情,使用数组来实现列表、堆栈和树结构。不好玩,但我们都不想接触 C 的时候(我们的程序刚刚从 Pascal 转换过来,没有一个教授或 TA 有足够的 C 经验来正确教授它)。
  • @John Bode:现在的教授/助教会这么善于认识到自己的局限性吗?
  • @Jerry 那是高级查找表,不是链表。
【解决方案2】:

BCPL 具有构造 a*[b](在我们的实现中可以简化为 a!b,在 3B2 UNIX 机器上运行的 6809 嵌入式系统编译器),相当于 C 中的 a[b]。当然,仅 BCPL有词的概念,没有赋予 C 更多权力的所有结构等。

a!b 是相对于字地址的字偏移量,但我们使用的实现还具有相对于字地址 a!%b 的字节偏移量和相对于字节地址 a%%b 的字节偏移量的选项。

【讨论】:

  • 您确定没有将 BCPL 与其他语言混淆吗?根据我对 Richards 的 BCPL 手册的副本,可以通过 v*[42] 访问向量的元素
  • 有趣,@Christoph,a!b 也一定是我们实现的扩展(如!%%%)。因为那是我用过的唯一 BCPL,所以我认为它是基础语言的一部分。调整答案以反映这一点。
  • 您可以在fh-jena.de/~kleine/history 找到 BCPL(和其他语言)参考手册的 PDF 版本;网上流传着另一个 PDF 版本 - 但是,另一个版本已经过 OCR 处理,导致一些令人困惑且有时是细微的错误(右值 左值)
【解决方案3】:

在这些语言中,可以将参数传递给函数按引用按值。引用意味着准确地传递指向该函数的指针。这也是用现代语言(如 C# 和 Visual Basic)完成的。

【讨论】:

  • 引用不允许你做任何指针运算。最好将引用描述为指针的有限子集。顺便说一句,Visual Basic 不是现代语言。
  • @Lundin:这基本上是把 C++ 的指针和引用实现作为术语本身的定义。帕斯卡指针不支持算术。 Algol 68 中的引用比 C++ 引用更接近 C++ 指针。
  • 这可能只是定义,因为现代语言(即 C# 和 Java)以与 C++ 相同的方式使用引用。
  • @Lundin:不,他们没有。 C++ 引用不能被反弹。 C# 和 Java 中的引用都可以。
  • 标准/经典帕斯卡没有。几乎所有 32/64 位生产编译器都可以。
【解决方案4】:

不要忘记 ADA(和 VHDL)访问类型。并且汇编和(gasp)机器码支持间接,虽然没有pointer类型,但都在使用中。

【讨论】:

  • 并且汇编和(gasp)机器代码支持间接,提醒我6502 指针在代码中的位置,自零页起具有绝对索引+Y 间接限制(由于可用字节非常少)
【解决方案5】:

指针表示的功能很早就出现在计算机机器语言中,因此语言总是允许对功能进行某种访问,即使并不总是像指针那样普遍。 我记得曾咨询过将一些 K&R C 代码移植到 Fortran 66 中的问题。C 代码中充满了指向结构的指针,这些指针不能很好地映射到 Fortran 66 的任何特性。

假设 C 代码具有如下结构:

结构数据结构{ 国际; 浮动 fval; } 数据[100];

Fortran 映射有一个公共块(不确定我的格式是否正确,我的 Fortran 66 非常陈旧):

常见/DATASTRUCT/IVAL(100), FVAL(100)

C 中的函数接受指向结构的指针不必知道该结构是来自数组还是被 malloc'ed 或其他任何东西:

float func(struct datastruct *sp) { 返回 sp->ival * sp->fval; }

当映射到 Fortran 66 时,所有“结构”都只是公共块中包含的数组的索引:

FUNCTION FUNC(INDEX)
COMMON /DATASTRUCT/ IVAL(100), FVAL(100)
RETURN IVAL(INDEX) * FVAL(INDEX)

没有指针那么优雅,但在 CDC 7600 上完成了当天的工作。

【讨论】:

    【解决方案6】:

    Lisp 是 1950 年代发明的一种语言,它有指针。事实上,指针是 Lisp 中数据管理的核心。 “Lisp”是“List Processor”的缩写,列表是(是)Lisp 中的链表。这可能是最早使用指针作为构建块的语言之一。

    在大多数 Lisp 方言中,一个列表元素包含两个项目。一个是原始数据 l 元素,如数字,或者是指向该元素的长子的指针。第二个元素是指向该元素的下一个兄弟的指针。可以从这些元素构建任意复杂度的树或图结构。

    lisp 的第一个实现都具有自动垃圾回收功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多