📜  Pascal-指针

📅  最后修改于: 2020-11-03 16:17:41             🧑  作者: Mango


帕斯卡的指针简单易学。使用指针可以更轻松地执行某些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编程非常重要。以下是一些重要的指针概念,对于Pascal程序员来说应该很清楚-

Sr.No Concept & Description
1 Pascal – Pointer arithmetic

There are four arithmetic operators that can be used on pointers: increment,decrement, +, –

2 Pascal – Array of pointers

You can define arrays to hold a number of pointers.

3 Pascal – Pointer to pointer

Pascal allows you to have pointer on a pointer and so on.

4 Passing pointers to subprograms in Pascal

Passing an argument by reference or by address both enable the passed argument to be changed in the calling subprogram by the called subprogram.

5 Return pointer from subprograms in Pascal

Pascal allows a subprogram to return a pointer.