指針可以加上或減去一個整數。指針的這種運算的意義和通常的數值的加減運算的意義是不一樣的。例如:
?
例二:?
1。chara[20];?
2。int*ptr=a;?
...?
...?
3。ptr++;?
在
上例中,指針ptr的類型是int*,它指向的類型是int,它被初始化為指向整形變量a。接下來的第3句中,指針ptr被加了1,編譯器是這樣處理的:
它把指針ptr的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字節做單位的,故ptr所指向的地址由原來的變量a的地址
向高地址方向增加了4個字節。?
由于char類型的長度是一個字節,所以,原來ptr是指向數組a的第0號單元開始的四個字節,此時指向了數組a中從第4號單元開始的四個字節。?
我們可以用一個指針和一個循環來遍歷一個數組,看例子:
例三:?
intarray[20];?
int*ptr=array;?
...?
//此處略去為整型數組賦值的代碼。?
...?
for(i=0;i<20;i++)?
{?
(*ptr)++;?
ptr++;?
}?
這個例子將整型數組中各個單元的值加1。由于每次循環都將指針ptr加1,所以每次循環都能訪問數組的下一個單元。?
再看例子:?
例四:?
1。chara[20];?
2。int*ptr=a;?
...?
...?
3。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個字節。??
總結一下,一個指針ptrold加上一個整數n后,結果是一個新的指針ptrnew,?
ptrnew
的類型和ptrold的類型相同,ptrnew所指向的類型和ptrold所指向的類型也相同。ptrnew的值將比ptrold的值增加了n乘
sizeof(ptrold所指向的類型)個字節。就是說,ptrnew所指向的內存區將比ptrold所指向的內存區向高地址方向移動了n乘
sizeof(ptrold所指向的類型)個字節。?
一個指針ptrold減去一個整數n后,結果是一個新的指針ptrnew,ptrnew的類
型和ptrold的類型相同,ptrnew所指向的類型和ptrold所指向的類型也相同。ptrnew的值將比ptrold的值減少了n乘sizeof
(ptrold所指向的類型)個字節,就是說,ptrnew所指向的內存區將比ptrold所指向的內存區向低地址方向移動了n乘sizeof
(ptrold所指向的類型)個字節。?