深入理解指针数据类型及操作
1. 指针概念引入
先来看下面的语句:
M [1] := 0;
M [ M [1] ] := 100;
乍一看,这些语句可能令人困惑,但它们执行的操作与之前的示例类似。第一条语句将 0 存储到数组元素 M[1] 中。第二条语句获取 M[1] 的值(即 0),并使用该值来确定将值 100 存储的位置。
如果认为这个例子合理(也许有些奇怪,但仍然有用),那么理解指针就没问题了,因为 M[1] 类似于一个指针。严格来说不是,但如果把 M 看作“内存”,并将该数组的每个元素视为一个独立的内存位置,那么它就符合指针的定义,即一个内存变量,其值是其他某个内存对象的地址。
2. 高级语言中的指针实现
虽然大多数语言使用内存地址来实现指针,但指针实际上是内存地址的一种抽象。因此,一种语言可以使用任何将指针值映射到内存中某个对象地址的机制来定义指针。
例如,Pascal 的某些实现使用相对于固定内存地址的偏移量作为指针值。一些语言(包括像 Lisp 这样的动态语言)可能实际上通过使用双重间接寻址来实现指针,即指针对象包含某个内存变量的地址,而该内存变量的值是要访问的对象的地址。这种方法可能看起来有些复杂,但在复杂的内存管理系统中具有一定优势,能更轻松、高效地重用内存块。
不过,为了简单起见,我们假设指针是一个变量,其值是内存中其他某个对象的地址。对于许多可能遇到的高性能高级语言(如 C、C++ 和 Delphi),这是一个合理的假设。
可以使用两条 80x86 机