雜談指標 指標的移動

2021-09-09 01:18:59 字數 1115 閱讀 3144

剛剛在群裡看到乙個這樣的問題

monopixel: pbyte;

inc(integer(monopixel));這個在32位下沒問題,為啥64位不能編譯呢?

咋一看,以為是把裡面的值進行累加,後來一想應該是移動一下指標。

對於這種移動指標的做法有兩個錯誤:

第乙個是用了integer,來轉換指標如果在32位下面顯然是沒有問題的,但是如果是64位,指標是64位,顯然再用integer是錯誤的。

第二個轉換成ineger後加一,那就相當於整數值 + 1,在pbyte時沒有問題,因為byte也是乙個位元組。但是如果是pinteger指標就會出現錯誤。

我們來看下**:

如果是pinteger下面應該怎麼樣做:

var

p, d:pinteger;

x :

array [0..10] of

integer;

begin

x[5] := 120

; p :=@x;

d :=p;

inc(d,

5);

首先所有的指標都是乙個整數值

可以看到如果用inc移動指標,並且會按照指標的型別進行累加,上面pinteger型別inc後是增加的sizeof(integer)。指向陣列的下乙個元素。

如果單純的轉換成整數來 + 1會 指標的值就是$12ea75顯然不是指向下乙個元素。當然你取到的值也是錯誤的。如下面的圖

顯然d^不是我們想要的資料。

除了用inc,也可以這樣做,下面的做法也是正確的。

請操作指標的朋友們注意啦。

*以上**在xe6下面測試執行

*注意沒有intptr型別的可以自己定義下型別

type

intptr = cardinal

雜談指標 指標的移動

剛剛在群裡看到乙個這樣的問題 monopixel pbyte inc integer monopixel 這個在32位下沒問題,為啥64位不能編譯呢?咋一看,以為是把裡面的值進行累加,後來一想應該是移動一下指標。對於這種移動指標的做法有兩個錯誤 第乙個是用了integer,來轉換指標如果在32位下面...

指標的移動

1 指標移動 所謂指標移動就是對指標變數加上減去乙個整數,或通過賦值運算,使指標變數向相鄰的儲存單元。因此只有當指標指向一串連續的儲存單元時,指標的移動才有意義 1122 3344 55a 0 a 1 a 2 a 3 a 4 p a 0 q p 2 q q q p 對指標進行加減運算時,數字 1 不...

C 雜談 C 指標

1.何為指標 程式執行時,任何變數都是存放在記憶體中的,通過將記憶體以位元組的大小劃分,為每個位元組增添索引,某一變數的位址就是該變數在記憶體中所佔的第乙個位元組的索引。此時,定義一變數用來存放開始第乙個位元組的索引,這個變數就被稱為指標,通過該變數的值可以間接的訪問該指標所指向的變數。在32位系統...