帕斯卡 - 指针


Pascal 中的指针学习起来既简单又有趣。一些 Pascal 编程任务使用指针可以更轻松地执行,而其他任务(例如动态内存分配)如果不使用指针则无法执行。所以学习指针成为一名完美的Pascal程序员是必要的。让我们开始通过简单易行的步骤来学习它们。

如您所知,每个变量都是一个内存位置,并且每个内存位置都定义了其地址,可以使用指针变量的名称进行访问,指针变量表示内存中的地址。

什么是指针?

指针是一个动态变量,其值是另一个变量的地址,即内存位置的直接地址。与任何变量或常量一样,您必须先声明一个指针,然后才能使用它来存储任何变量地址。指针变量声明的一般形式是 -

type
   ptr-identifier = ^base-variable-type;

指针类型是通过在脱字号 (^) 的向上箭头前加上基本类型来定义的。基本类型定义数据项的类型。一旦指针变量被定义为某种类型,它就只能指向该类型的数据项。一旦定义了指针类型,我们就可以使用var声明来声明指针变量。

var
   p1, p2, ... : ptr-identifier;

以下是一些有效的指针声明 -

type
   Rptr = ^real;
   Cptr = ^char;
   Bptr = ^ Boolean;
   Aptr = ^array[1..5] of real;
   date-ptr = ^ date;
      Date = record
         Day: 1..31;
         Month: 1..12;
         Year: 1900..3000;
      End;
var
   a, b : Rptr;
   d: date-ptr;

使用相同的插入符号 (^) 取消引用指针变量。例如,指针rptr引用的关联变量是rptr^。它可以通过以下方式访问 -

rptr^ := 234.56;

下面的例子将说明这个概念 -

program exPointers;
var
   number: integer;
   iptr: ^integer;

begin
   number := 100;
   writeln('Number is: ', number);
   
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
end.

当上面的代码被编译并执行时,它会产生以下结果 -

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200

用 Pascal 打印内存地址

在 Pascal 中,我们可以使用地址运算符 (@) 将变量的地址分配给指针变量。我们使用这个指针来操作和访问数据项。但是,如果由于某种原因,我们需要使用内存地址本身,则需要将其存储在字类型变量中。

让我们扩展上面的例子来打印存储在指针iptr中的内存地址-

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   number := 100;
   writeln('Number is: ', number);
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
   y := addr(iptr);
   writeln(y^); 
end.

当上面的代码被编译并执行时,它会产生以下结果 -

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
45504

NIL 指针

如果您没有要分配的确切地址,则将NIL值分配给指针变量始终是一个好习惯。这是在变量声明时完成的。被赋值为NIL 的指针指向任何地方。考虑以下程序 -

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   iptr := nil;
   y := addr(iptr);
   
   writeln('the vaule of iptr is ', y^);
end.

当上面的代码被编译并执行时,它会产生以下结果 -

The value of ptr is 0

要检查nil指针,您可以使用 if 语句,如下所示 -

if(ptr <> nill )then     (* succeeds if p is not null *)
if(ptr = nill)then    (* succeeds if p is null *)

帕斯卡指针详细信息

指针有很多但简单的概念,它们对于 Pascal 编程非常重要。Pascal 程序员应该清楚以下几个重要的指针概念:

先生编号 概念与描述
1 Pascal - 指针算术

可以在指针上使用四种算术运算符:递增、递减、+、-

2 Pascal - 指针数组

您可以定义数组来保存多个指针。

3 Pascal - 指向指针的指针

Pascal 允许您将指针放在指针上等等。

4 将指针传递给 Pascal 中的子程序

通过引用或通过地址传递参数都可以使被调用子程序在调用子程序中更改传递的参数。

5 从 Pascal 子程序返回指针

Pascal 允许子程序返回指针。