指標可以加上或減去乙個整數。指標的這種運算的意義和通常的數值的加減運算的意義是不一樣的。例如:
例二:
1。 char a[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號單元開始的四個位元組。
我們可以用乙個指標和乙個迴圈來遍歷乙個陣列,看例子:
例三:
int array[20];
int *ptr=array;
...
//此處略去為整型陣列賦值的**。
...
for(i=0;i<20;i++)
這個例子將整型陣列中各個單元的值加1。由於每次迴圈都將指標ptr加1,所以每次迴圈都能訪問陣列的下乙個單元。
再看例子:
例四:
1。 char a[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所指向的型別)個位元組。
指標的算術運算
指標可以加上或減去乙個整數的算術運算。首先來看個例子 include int main void short st 3 double pw wa short ps st 0 cout pw 分析上面的程式,我們可以看到,c 一般把陣列名和第乙個元素的位址等價,所以我們可以用上面的兩種方法初始化指標,...
指標的算術運算
指標和陣列 指標和陣列在c語言中有錯綜複雜的聯絡。在前面的課程中,你學會了如何宣告陣列變數 int anarray 5 declare array of 5 integers 關聯陣列實際上是指標,指向陣列的第乙個元素!因為陣列變數 是指標,你可以解析它 它返回 陣列元素0 123 4567 int...
指標的算術運算
指標的算術運算 c語言允許你在指標執行整數的加減運算。如果pnptr指向乙個整數,pnptr 1 pnptr後在記憶體中的位址的下乙個整數。pnptr 1是在pnptr以前的整數字址。請注意,pnptr 1不在pnptr返回位址,但下乙個物件,pnptr分型。如果pnptr指向乙個整數 假設4位元組...