1、指针自增
当指针加 1 时,指针会指向下一个元素的内存地址。对于不同类型的指针,加法操作会根据数据类型的大小来改变地址的值。在程序中使用指针代替数组,因为变量指针可以自增,而数组不能自增,数组可以看成一个指针常量。以便顺序访问数组中的每一个元素。
例如,
#include <stdio.h> const int MAX = 3; int main () { int var[] = {10, 50, 300}; int i, *ptr; /* 指针中的数组地址 */ ptr = var; for ( i = 0; i < MAX; i++) { printf("存储地址:var[%d] = %p\n", i, ptr ); printf("存储值:var[%d] = %d\n", i, *ptr ); /* 指向下一个位置 */ ptr++; } return 0; }
2、指针自减
与指针加法同理,指针减法是让指针指向前一个元素。ptr--
会让指针向后移动。在程序中使用指针循环遍历数组,还可以使用变量指针进行自减。
例如,
#include <stdio.h> const int MAX = 3; int main () { int var[] = {10, 40, 200}; int i, *ptr; /* 指针中最后一个元素的地址 */ ptr = &var[MAX-1]; for ( i = MAX; i > 0; i--) { printf("存储地址:var[%d] = %p\n", i-1, ptr ); printf("存储值:var[%d] = %d\n", i-1, *ptr ); /* 指向下一个位置 */ ptr--; } return 0; }
3、比较指针
指针变量除了可以参与加减运算,还可以参与比较运算,如 ==、< 和 >。当对指针变量进行比较运算时,比较的是指针变量本身的值,也就是数据的地址。如果地址相等,那么两个指针就指向同一份数据,否则就指向不同的数据。
例如,
#include <stdio.h> const int MAX = 3; int main () { int var[] = {10, 80, 190}; int i, *ptr; /* 指针中第一个元素的地址 */ ptr = var; i = 0; while ( ptr <= &var[MAX - 1] ) { printf("存储地址:var[%d] = %p\n", i, ptr ); printf("存储值:var[%d] = %d\n", i, *ptr ); /* 指向下一个位置 */ ptr++; i++; } return 0; }
4、指针的算术运算和指针指向的数据类型
指针的加减运算是按照其指向的数据类型的大小进行的。比如对于 int
类型指针,ptr + 1
实际上会增加 sizeof(int)
字节;而对于 double
类型指针,ptr + 1
会增加 sizeof(double)
字节。
#include <stdio.h> int main() { double arr[] = {1.1, 2.2, 3.3}; double *ptr = arr; // 指向数组的第一个元素 printf("ptr 当前指向的值: %.1f\n", *ptr); // 输出 1.1 ptr++; // 指针向前移动一个元素 printf("ptr 移动后指向的值: %.1f\n", *ptr); // 输出 2.2 return 0; }