0

このコードを検討してください:

program test;
uses crt;

var ptr1, ptr2:^integer;

begin
     new(ptr1);
     new(ptr2);
     writeln('ptr1: ',integer(@ptr1), ', ptr2: ', integer(@ptr2));
     ptr1:=ptr2;
     write('ptr1: ',integer(@ptr1), ', ptr2: ', integer(@ptr2));
     readln;
end.

2番目の'write'は、ptr1とptr2に対して同じ結果をもたらすはずですが、(lazarus-free pascal)を与えます:

ptr1: 4243456, ptr2: 4243472
ptr1: 4243456, ptr2: 4243472

私の意見では、次のようになります。

ptr1: 4243472, ptr2: 4243472

私はポインタにまったく慣れていません。私は何か間違ったことを理解しましたか?

よろしく。

4

2 に答える 2

1

@ptr1 と書くと、ポインターにアクセスするのではなく、ptr を指す新しいポインターを作成します。(pascal は可変プレフィックスを持つ perl とは異なります)

あなたが書くとき

 writeln('ptr1: ',integer(ptr1), ', ptr2: ', integer(ptr2));
 ptr1:=ptr2;
 write('ptr1: ',integer(ptr1), ', ptr2: ', integer(ptr2));

、あなたはあなたが期待したものを手に入れます

(ただし、整数は 32 ビット システムでのみ機能するため、整数の代わりに PtrInt を使用することをお勧めします)

于 2012-11-01T11:55:25.373 に答える