C語言中的指標加減偏移量

2021-06-07 21:17:34 字數 1276 閱讀 3087

首先看一段程式:

[cpp:nogutter]view plain

copy

#include 

intmain()  

;  int

* p = (

int*)(&a + 1);  

printf("%d, %d /n"

, *(a + 1), *(p - 1));  

return

0;  

}  

輸出結果為:

第乙個結果好說,a+1後指標指向了陣列中的『2』。 而第二個為什麼輸出『5』呢。 原理是c語言中的指標加減後,會根據指標的型別採用不同的偏移量。

比如, int* a;     int* b = a+1;  則 b - a = sizeof(int)

char* a; char* b = a+1; 則b - a = sizeof (char)  

將上述程式改寫如下,更容易認識其本質

[cpp:nogutter]view plain

copy

intmain()  

;  int

(*ptr)[5] = &a + 1;  

//int* p = (int*)(&a + 1);

int* p = (

int*)ptr;  

printf("%d, %d /n"

, *(a + 1), *(p - 1));  

return

0;  

}  

其中只是引入了乙個中間變數 ptr指標, ptr指標的型別是 指向陣列長度為5的指標, 所以 ptr + 1  其實是加了sizeof(a)的位元組量,

ptr+1後指向了從a後面,即a開始數第6個位元組。

注意指向陣列指標的寫法。括號不能丟。

int a[n], 則a是乙個陣列型別,而不是int型了,要注意正確對待。

a與&a的值一樣,但意義不一樣, a+1的偏移量為乙個int,相當於&a[0], &a+1的偏移量為真個陣列。是陣列型別的指標。

C語言中的指標加減偏移量

首先看一段程式 輸出結果為 2,5 第乙個結果好說,a 1後指標指向了陣列中的 2 而第二個為什麼輸出 5 呢。原理是c語言中的指標加減後,會根據指標的型別採用不同的偏移量。比如,int a int b a 1 則 b a sizeof int char a char b a 1 則b a size...

檔案指標偏移量

f.seek offset,whence offset代表檔案的指標的偏移量,單位是位元組bytes whence代表參考物,有三個取值 0 參照檔案的開頭 1 參照當前檔案指標所在位置 2 參照檔案末尾 ps 快速移動到檔案末尾f.seek 0,2 強調 其中whence 1和whence 2只能...

C語言中結構體偏移量的計算

一 先來一段理論知識 ansi c標準允許任何值為0的常量被強制轉換成任何一種型別的指標,並且轉換結果是乙個null指標,因此 s 0 的結果就是乙個型別為s 的null指標。如果利用這個null指標來訪問s的成員當然是非法的,但 s 0 m 的意圖並非想訪問s欄位內容,而僅僅是計算當結構體例項的首...