C 指針的算術運算
C 指針是一個用數值表示的地址。 因此,您可以對指針執行算術運算。 可以對指針進行四種算術運算:++、--、+、-。
假設ptr是一個指向地址1000的整型指針,是一個32位的整數,讓我們對該指針執行下列的算術運算:
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; /* 指针中的数组地址 */ ptr = var; for ( i = 0; i < MAX; i++) { printf("Address of var[%d] = %x\n", i, ptr ); printf("Value of var[%d] = %d\n", i, *ptr ); /* 移动到下一个位置 */ 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; /* 指针中最后一个元素的地址 */ ptr = &var[MAX-1]; for ( i = MAX; i > 0; i--) { printf("Address of var[%d] = %x\n", i, ptr ); printf("Value of var[%d] = %d\n", i, *ptr ); /* 移动到下一个位置 */ 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; /* 指针中第一个元素的地址 */ ptr = var; i = 0; while ( ptr <= &var[MAX - 1] ) { printf("Address of var[%d] = %x\n", i, ptr ); printf("Value of var[%d] = %d\n", i, *ptr ); /* 指向上一个位置 */ 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