Pascal - 指標運算



如主要章節所述,Pascal 指標是一個地址,它是一個儲存在字中的數值。因此,您可以對指標執行算術運算,就像對數值執行算術運算一樣。有四個算術運算子可用於指標:增量、減量、+ 和 -。

為了理解指標運算,讓我們考慮 ptr 是一個指向地址 1000 的整數指標。假設 32 位整數,讓我們對指標執行增量運算 -

Inc(ptr);

現在,在上述操作之後,ptr 將指向位置 1004,因為每次ptr遞增時,它將指向下一個整數位置,即當前位置後面的 4 個位元組。此操作將指標移動到下一個記憶體位置,而不會影響記憶體位置的實際值。如果ptr指向一個字元,其地址為 1000,則上述操作將指向位置 1001,因為下一個字元將在 1001 處可用。

指標的增量

我們更傾向於在程式中使用指標而不是陣列,因為變數指標可以遞增,而陣列名稱則不能遞增,因為它是一個常量指標。以下程式遞增變數指標以訪問陣列的每個後續元素 -

program exPointers;
const MAX = 3;
var
   arr: array [1..MAX] of integer = (10, 100, 200);
   i: integer;
   iptr: ^integer;
   y: ^word;

begin
   (* let us have array address in pointer *)
   iptr := @arr[1];
   
   for  i := 1 to MAX do
   begin
      y:= addr(iptr);
      writeln('Address of arr[', i, '] = ' , y^ );
      writeln(' Value of arr[', i, '] = ' , iptr^ );
      
      (* move to the next location *)
      inc(iptr);
   end;
end.

編譯並執行上述程式碼後,將產生以下結果 -

Address of arr[1] = 13248
 Value of arr[1] = 10
Address of arr[2] = 13250
 Value of arr[2] = 100
Address of arr[3] = 13252
 Value of arr[3] = 200

指標的減量

相同的考慮因素適用於指標的減量,它將指標的值減少其資料型別的位元組數,如下所示 -

program exPointers;
const MAX = 3;
var
   arr: array [1..MAX] of integer = (10, 100, 200);
   i: integer;
   iptr: ^integer;
   y: ^word;

begin
   (* let us have array address in pointer *)
   iptr := @arr[MAX];
   
   for  i := MAX downto 1 do
   begin
      y:= addr(iptr);
      writeln('Address of arr[', i, '] = ' , y^ );
      writeln(' Value of arr[', i, '] = ' , iptr^ );

      (* move to the next location *)
      dec(iptr);
   end;
end.

編譯並執行上述程式碼後,將產生以下結果 -

Address of arr[3] = 13252
 Value of arr[3] = 200
Address of arr[2] = 13250
 Value of arr[2] = 100
Address of arr[1] = 13248
 Value of arr[1] = 10

指標比較

可以使用關係運算符(例如 =、< 和 >)來比較指標。如果 p1 和 p2 指向彼此相關的變數,例如同一陣列的元素,則可以有意義地比較 p1 和 p2。

以下程式修改了前面的示例,透過遞增變數指標來實現,只要它指向的地址小於或等於陣列最後一個元素的地址(即 @arr[MAX]) -

program exPointers;
const MAX = 3;
var
   arr: array [1..MAX] of integer = (10, 100, 200);
   i: integer;
   iptr: ^integer;
   y: ^word;

begin
   i:=1;
   
   (* let us have array address in pointer *)
   iptr := @arr[1];
   
   while (iptr <= @arr[MAX]) do
   begin
      y:= addr(iptr);
      writeln('Address of arr[', i, '] = ' , y^ );
      writeln(' Value of arr[', i, '] = ' , iptr^ );
      
      (* move to the next location *)
      inc(iptr);
      i := i+1;
   end;
end.

編譯並執行上述程式碼後,將產生以下結果 -

Address of arr[1] = 13248
 Value of arr[1] = 10
Address of arr[2] = 13250
 Value of arr[2] = 100
Address of arr[3] = 13252
 Value of arr[3] = 200
pascal_pointers.htm
廣告