#include <iostream>
void processArray(int (*ptr)[4], int rows) {
for (int i = 0; i < rows; ++i) {
int sum = 0;
for (int j = 0; j < 4; ++j) {
sum += *(*(ptr + i) + j);
}
std::cout << "Sum of row " << i << " is: " << sum << std::endl;
}
}
指针在二维数组传参和操作过程中的应用
- 传参:
- 在函数
processArray
中,参数int (*ptr)[4]
是一个指向含有4个int
元素的数组的指针。这里ptr
指向二维数组的第一行,因为二维数组在内存中是按行存储的。rows
参数表示二维数组的行数。
- 当我们调用
processArray(arr, 3)
时,arr
作为二维数组名,它会自动转换为指向其第一行的指针,也就是&arr[0]
,类型为int (*)[4]
,这与函数参数ptr
的类型相匹配。
- 操作:
*(ptr + i)
指向二维数组的第i
行。这是因为ptr
是指向含有4个int
元素的数组的指针,ptr + i
会根据数组的存储方式,移动到第i
个这样的数组(即第i
行)。
*(*(ptr + i) + j)
访问第i
行第j
列的元素。*(ptr + i)
指向第i
行,*(ptr + i) + j
则指向该行的第j
个元素(因为指针算术运算),再通过*
取值得到实际元素。
与一维数组传参指针操作的异同点
- 相同点:
- 传参:一维数组传参时,数组名也会自动转换为指针,例如
void func(int *ptr)
,这里ptr
指向数组的第一个元素。二维数组传参同样将数组名转换为指针,虽然指针类型不同,但都是通过指针传递数组首地址。
- 指针运算:都可以通过指针进行算术运算来访问数组元素。在一维数组中
*(ptr + i)
访问第i
个元素,二维数组中通过类似的指针运算*(*(ptr + i) + j)
访问特定位置元素。
- 不同点:
- 指针类型:一维数组传参指针类型是
int *
,指向单个int
元素。而二维数组传参指针类型如int (*)[4]
,指向含有特定数量(这里是4个)int
元素的数组。
- 多层间接访问:二维数组操作需要两层间接访问(
*(*(ptr + i) + j)
)来获取具体元素,因为它本质上是数组的数组;而一维数组只需要一层间接访问(*(ptr + i)
)。