二维数组的指针、
二维数组名作为参数传递使用时,形参要定义为数组指针的形式。一维数组的数组名是指向单个变量的指针。二维数组的数组名是指向单个数组的指针。
二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 a 为例:
int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
从概念上理解,a 的分布像一个矩阵:
0 1 2 3
4 5 6 7
8 9 10 11
但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存:

假设数组 a 中第 0 个元素的地址为 1000,那么每个一维数组的首地址如下图所示:

a,&a[0][0],a[0],*a,在物理上表示都是同一块内存空间的地址,都是指向第一个元素0的地址,但在概念上它们的意义不同。
对a进行解引用(*a)仍然会得到一个指针(并且它们的地址值还相同……),**a 就会得到值0。实际上a是一个二级指针,指向数组int[4],二级指针指向一级指针,一级指针指向a[0][0]。
int a[2][3] = { {0,1,1},{2,2,2} };
cout << a[0]<< endl; //是一个指向 {0,1,1}的指针
cout << *a[0] << endl; //值为0,这里把指向数组的指针转换为指向数组首元素的指针
cout << &a[0][0] << endl; //指向0的指针
cout << a << endl; //数组名称是二级指针,指向一个一级指针
cout << *a << endl; //一级指针指向a[0][0]
cout << **a << endl; //a[0][0]
二维数组做函数参数、
方法一:
由于数组都是在内存中是连续存储的方式,因此获取到第一个元素的指针,进行一个循环,循环条件为小于二维数组元素的个数。
int sumTowArray(int*start,size_t line,size_t row)
{
int sum = 0;
for (size_t i = 0; i < line * row; ++i)
{
sum += start[i];
}
return sum;
}
int a[2][3] = {{1,2,3},{4,5,6}};
sumTowArray(&a[0][0], 2, 3);
sumTowArray(a[0], 2, 3); //这里把指向数组的指针转换为指向数组首元素的指针
sumTowArray(*a,2,3);
方法二:
直接传入二维数组做参数,使用也简洁明了。
int sumTowArray(int array[2][3])
{
int sum = 0;
for (size_t i = 0; i < 2; ++i)
{
for (size_t j = 0; j < 3; ++j)
{
sum += array[i][j];
}
}
return sum;
}
int a[2][3] = { {0,1,3},{2,2,3} };
cout << sumTowArray(a) << endl;
方法三:
使用数组指针名称传递参数。
int sumTwoArray(int(*array)[3],size_t len) //array是一个指向元素为int[3]的数组的数组指针
{
int sum = 0;
for (size_t i = 0; i < len; ++i)
{
for (size_t j = 0; j < 3; ++j)
{
sum += array[i][j];
}
}
return sum;
}
int a[2][3] = { {0,1,3},{2,2,3} };
cout<<sumTwoArray(a, 2);
Comments NOTHING