编写将二维数组作为参数的函数,必须牢记,数组被视为地址,因此相应的形参是一个指针
//主函数部分
#include<iostream>
int sum(int(*arr)[3], int size);//声明函数
int main() {
int data[4][3] = { {1,2,3},{4,5,6},{7,8,9},{10,11,12} };
int total = sum(data, 4);
return 0;
}
data作为二维数组,arr作为数组名,并不指向二维数组第一个元素的地址,arr指向第一个列数组的地址(方便理解可以把第一个列数组看作一个单独一维数组),int(arr)[3]定义了列数,可以把(arr)看作一个新的一维数组名
参数arr是指向数组的指针,该如何使用,(将arr看作二维数组的名称)
//函数体部分
int sum(int arr[][3], int size) { //int arr[][3]=int(*arr)[3]
int total = 0;
for (int i = 0; i < size;i++) {
for (int j = 0; j < 3; j++) {
total+= arr[i][j];
}
}
return total;
}
arr是指针而不是数组。指针类型指出,它指向由3个int组成的数组。因此指针类型指定了列数([3]),这就是没有将列数作为独立函数参数传递的原因。 由于指针类型指定了列数,因此sum函数只能接受4列组成的数组,但长度变量(size)指定了行数,因此sum对行数没有限制
arr[i][j]=*(*(arr+i)+j); //连续两次解除指针应用
arr //指向第一个含有3个元素的列数组(整个一维数组)
arr+i //指向第i个含有3个元素的列数组
*arr //第一个列数组的第一个元素的地址
*(arr+i) //第i个列数组的第一个元素的地址
(*(arr+i)+j) // 第i个列数组的第j个元素的地址
*(*(arr+i)+j) //第i个列数组的第j个元素的值
由内而外解析表达式
sum()声明参数arr 的时候没有使用 const,因为const只能指向基本类型的指针,而arr是指向指针的指针(arr指向了一个指向第一个列元素第一元素指针,也就是*arr)