C語言指針運算
如在主章節說明,C指針是一個地址,它是一個數字值。因此可以在一個數值上進行指針算術運算。有跡象表明,可以在指針被用於4種算術運算符:++,-- ,+和-
要理解指針運算,讓我們考慮ptr是一個整數指針,它指向假設32位整數的地址1000,指針執行以下運算:
ptr++
現在,在上述操作之後,在ptr 將指向位置1004,因為每次ptr遞增,將指向下一個整數的位置是到當前位置下一個4個字節。此操作將指針移動到下一個內存位置,而不在內存位置影響實際值。如果ptr指向一個字符的地址是1000,那麼上麵的操作將指向1001的位置,因為下一個字符將在1001。
遞增一個指針
我們更喜歡在程序中使用一個數組的指針,不是因為變量指針可以被遞增,這是不能被遞增的,因為它是一個常數指針不像數組名。下麵的程序遞增變量指針來訪問該數組的每個後續元素:
#include <stdio.h> const int MAX = 3; int main () { int var[] = {10, 100, 200}; int i, *ptr; /* let us have array address in yiibaier */ ptr = var; for ( i = 0; i < MAX; i++) { printf("Address of var[%d] = %x ", i, ptr ); printf("Value of var[%d] = %d ", i, *ptr ); /* move to the next location */ ptr++; } return 0; }
當上述代碼被編譯和執行時,它會產生一些結果如下:
Address of var[0] = bf882b30 Value of var[0] = 10 Address of var[1] = bf882b34 Value of var[1] = 100 Address of var[2] = bf882b38 Value of var[2] = 200
遞減指針
指針適用於遞減,如下所示而減小其數據類型的字節數的值:
#include <stdio.h> const int MAX = 3; int main () { int var[] = {10, 100, 200}; int i, *ptr; /* let us have array address in yiibaier */ ptr = &var[MAX-1]; for ( i = MAX; i > 0; i--) { printf("Address of var[%d] = %x ", i, ptr ); printf("Value of var[%d] = %d ", i, *ptr ); /* move to the previous location */ ptr--; } return 0; }
當上述代碼被編譯和執行時,它會產生一些結果如下:
Address of var[3] = bfedbcd8 Value of var[3] = 200 Address of var[2] = bfedbcd4 Value of var[2] = 100 Address of var[1] = bfedbcd0 Value of var[1] = 10
指針比較
指針可以通過關係運算符進行比較,如:==, < 和 >。如果p1和p2指向被彼此相關的變量,例如相同的數組元素,則p1和p2可以進行有意義的比較。
下麵的程序修改前麵的例子通過遞增變量指針作為地址它指向小於或等於數組的最後一個元件的地址是 &var[MAX - 1]:
#include <stdio.h> const int MAX = 3; int main () { int var[] = {10, 100, 200}; int i, *ptr; /* let us have address of the first element in yiibaier */ ptr = var; i = 0; while ( ptr <= &var[MAX - 1] ) { printf("Address of var[%d] = %x ", i, ptr ); printf("Value of var[%d] = %d ", i, *ptr ); /* yiibai to the previous location */ ptr++; i++; } return 0; }
當上述代碼被編譯和執行時,它會產生一些結果如下:
Address of var[0] = bfdbcb20 Value of var[0] = 10 Address of var[1] = bfdbcb24 Value of var[1] = 100 Address of var[2] = bfdbcb28 Value of var[2] = 200