指针算术
指针是C语言的一个重要概念,指针变量存放的是内存地址。通过指针变量可以直接访问内存中存放的数据,这在操作一些复杂数据结构时非常方便。在指针基础上,C语言引入了指针算术运算,在指针上增加或减少一个整数值,指向新的内存地址。
指针算术的规则
指针算术使用的是和机器无关的规则:
指针加一个正整数,地址增加相应字节数
指针加一个负整数,地址减少相应字节数
两个指针相减,得到两个指针之间元素的个数
使用指针算术计算数组的和
使用指针算术可以非常方便地计算数组的和。我们可以先定义一个指向数组首元素的指针,然后使用指针算术访问数组中的元素,并累加元素的值:
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // 指向arr的首元素
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += *(p + i); // 使用指针算术访问元素
}
指向数组的指针
在C语言中,数组名本质上是一个指向首元素的指针。因此,我们可以定义指向数组的指针来访问数组中的元素,并使用指针算术来遍历数组:
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // 指向arr的首元素
for (int i = 0; i < 5; i++) {
printf("%d\n", *(p + i)); // 使用指针算术访问元素
}
使用指针数组
指针数组是一个数组,其中的每个元素都是指针。我们可以使用指针数组来存储指向不同类型的数据的指针。例如,我们可以定义一个指针数组,其中的每个元素都指向一个整型数组:
int arr1[5] = {1, 2, 3, 4, 5};
int arr2[3] = {6, 7, 8};
int arr3[4] = {9, 10, 11, 12};
int *arr[] = {arr1, arr2, arr3}; // 定义一个指针数组
for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
int *p = arr[i]; // 获取指向数组的指针
int sum = 0;
for (int j = 0; j < sizeof(arr[i])/sizeof(arr[i][0]); j++) {
sum += *(p + j); // 使用指针算术访问元素
}
printf("sum of arr%d: %d\n", i+1, sum);
}
指针算术的优点在于它可以减少程序中的内存拷贝操作,提高程序的运行效率。但需要注意的是,在使用指针算术时,必须确保指针指向的内存区域是有效的。