指標可以加上或減去乙個整數。
指標的這種運算的意義和通常的數值的加減運算的意義是不一樣的,以單元為單位。例如:
例二:char a[20];
int *ptr=(int *)a; //強制型別轉換並不會改變a 的型別
ptr++;
在上例中,指標ptr 的型別是int*,它指向的型別是int,它被初始化為指向整型變數a。接下來的第3 句中,指標ptr 被加了1,編譯器是這樣處理的:它把指標ptr 的值加上了sizeof(int),在32 位程式中,是被加上了4,因為在32 位程式中,int 佔4 個位元組。由於位址是用位元組做單位的,故ptr 所指向的位址由原來的變數a 的位址向高位址方向增加了4 個位元組。由於char 型別的長度是乙個位元組,所以,原來ptr 是指向陣列a 的第0 號單元開始的四個位元組,此時指向了陣列a 中從第4 號單元開始的四個位元組。
我們可以用乙個指標和乙個迴圈來遍歷乙個陣列,看例子:
例三: int array[20]=; int *ptr=array; for(i=0;i<20;i++)
這個例子將整型陣列中各個單元的值加1。由於每次迴圈都將指標ptr加1 個單元,所以每次迴圈都能訪問陣列的下乙個單元。
再看例子:
例四:char a[20]="you_are_a_girl"; int *ptr=(int *)a; ptr+=5;
在這個例子中,ptr 被加上了5,編譯器是這樣處理的:將指標ptr 的值加上5 乘sizeof(int),在32 位程式中就是加上了5 乘4=20。由於位址的單位是位元組,故現在的ptr 所指向的位址比起加5 後的ptr 所指向的位址來說,向高位址方向移動了20 個位元組。在這個例子中,沒加5 前的ptr 指向陣列a 的第0 號單元開始的四個位元組,加5 後,ptr 已經指向了陣列a 的合法範圍之外了。雖然這種情況在應用上會出問題,但在語法上卻是可以的。這也體現出了指標的靈活性。
如果上例中,ptr 是被減去5,那麼處理過程大同小異,只不過ptr 的值是被減去5 乘sizeof(int),新的ptr 指向的位址將比原來的ptr 所指向的位址向低位址方向移動了20 個位元組。
下面請允許我再舉乙個例子:(乙個誤區)
例五:#includeint main()
誤區一、輸出答案為y 和o
誤解:ptr 是乙個char 的二級指標,當執行ptr++;時,會使指標加乙個sizeof(char),所以輸出如上結果,這個可能只是少部分人的結果.
誤區二、輸出答案為y 和a
誤解:ptr 指向的是乙個char *型別,當執行ptr++;時,會使指標加乙個sizeof(char *)(有可能會有人認為這個值為1,那就會得到誤區一的答案,這個值應該是4,參考前面內容), 即&p+4; 那進行一次取值運算不就指向陣列中的第五個元素了嗎?那輸出的結果不就是陣列中第五個元素了嗎?答案是否定的.
正解: ptr 的型別是char **,指向的型別是乙個char *型別,該指向的位址就是p的位址(&p),當執行ptr++;時,會使指標加乙個sizeof(char*),即&p+4;那*(&p+4)指向哪呢,這個你去問上帝吧,或者他會告訴你在哪?所以最後的輸出會是乙個隨機的值,或許是乙個非法操作.
總結一下:
乙個指標ptrold 加(減)乙個整數n 後,結果是乙個新的指標ptrnew,ptrnew 的型別和ptrold 的型別相同,ptrnew 所指向的型別和ptrold所指向的型別也相同。ptrnew 的值將比ptrold 的值增加(減少)了n 乘sizeof(ptrold 所指向的型別)個位元組。就是說,ptrnew 所指向的記憶體區將比ptrold 所指向的記憶體區向高(低)位址方向移動了n 乘sizeof(ptrold 所指向的型別)個位元組。
指標和指標進行加減:
兩個指標不能進行加法運算,這是非法操作,因為進行加法後,得到的結果指向乙個不知所向的地方,而且毫無意義。兩個指標可以進行減法操作,但必須型別相同,一般用在陣列方面,不多說了。
1 讓你不再害怕指標 細說指標
指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別 指標所指向的型別 指標的值或者叫指標所指向的記憶體區 指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 int ptr 2 char ptr 3 in...
1 讓你不再害怕指標 細說指標
指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別 指標所指向的型別 指標的值或者叫指標所指向的記憶體區 指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 int ptr 2 char ptr 3 in...
8 讓你不再害怕指標 指標型別轉換
當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。例十五 float f 12.3 float fptr f int p 在上面...