如在主章节说明,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