C 语言 指针的算术运算
C 指针是一个用整数表示的地址。因此,我们可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。
假设 ptr 是一个指向地址 1000 的整型(int) 指针,当我们对该指针执行下列的算术运算:
ptr++
在执行完上述的运算之后, ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节。
这个运算会在不影响内存位置中实际值的情况下,移动指针到下一个内存位置。 如果 ptr 指向一个地址为 1000 的字符,上面的运算会导致指针指向位置 1001,因为 char 的长度是 1,所以下一个字符位置是在 1001。
递增一个指针
可以在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,因为数组是一个常量指针。
下面的范例演示了递增变量指针,以便顺序访问数组中的每一个元素
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> const int MAX = 4; int main () { int var[] = {9, 99, 999, 999}; int i, *ptr; /* 指针中的数组地址 */ ptr = var; for ( i = 0; i < MAX; i++) { printf("存储地址:var[%d] = %ld\n", i, (long)ptr ); printf("存储值:var[%d] = %-3d\n", i, *ptr ); printf("\n"); ptr++; // 移动到下一个位置 } return 0; }
范例中我们使用 %ld
代替 %p
显示内存地址,因为这样更方便看到每次递增指针的长度。
编译和运行上面的程序,输出结果如下
$ gcc main.c && a.out 存储地址:var[0] = 140734775243456 存储值:var[0] = 9 存储地址:var[1] = 140734775243460 存储值:var[1] = 99 存储地址:var[2] = 140734775243464 存储值:var[2] = 999 存储地址:var[3] = 140734775243468 存储值:var[3] = 999
递减一个指针
同样地,对指针进行递减运算,即把值减去其数据类型的字节数
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> const int MAX = 4; int main () { int var[] = {9, 99, 999, 999}; int i, *ptr; /* 指针中的数组地址 */ ptr = &var[MAX-1]; for ( i = MAX; i > 0 ; i--) { printf("存储地址:var[%d] = %ld\n", i, (long)ptr ); printf("存储值:var[%d] = %-3d\n", i, *ptr ); printf("\n"); ptr--; // 移动到下一个位置 } return 0; }
编译和运行上面的范例,输出结果如下
$ gcc main.c && a.out 存储地址:var[4] = 140734783910604 存储值:var[4] = 999 存储地址:var[3] = 140734783910600 存储值:var[3] = 999 存储地址:var[2] = 140734783910596 存储值:var[2] = 99 存储地址:var[1] = 140734783910592 存储值:var[1] = 9
指针的比较
指针可以用关系运算符进行比较,如 ==、< 和 >。
如果 p1 和 p2 指向两个相关的变量,比如同一个数组中的不同元素,则可对 p1 和 p2 进行大小比较。
下面的范例中只要变量指针所指向的地址小于或等于数组的最后一个元素的地址 &var[MAX - 1],则把变量指针进行递增:
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> const int MAX = 4; int main () { int var[] = {9, 99, 999, 999}; int i, *ptr; /* 指针中的数组地址 */ ptr = var; i = 0; while ( ptr <= &var[MAX-1] ) { printf("存储地址:var[%d] = %ld\n", i, (long)ptr ); printf("存储值:var[%d] = %-3d\n", i, *ptr ); printf("\n"); ptr++; // 移动到下一个位置 i++; } return 0; }
编译和运行上面的代码,输出结果如下
$ gcc main.c && a.out 存储地址:var[0] = 140734711493312 存储值:var[0] = 9 存储地址:var[1] = 140734711493316 存储值:var[1] = 99 存储地址:var[2] = 140734711493320 存储值:var[2] = 999 存储地址:var[3] = 140734711493324 存储值:var[3] = 999