剛剛在群裡看到乙個這樣的問題
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位系統...