二维数组的指针,二维数组做函数参数

Aki 发布于 2022-11-20 238 次阅读


二维数组的指针、

二维数组名作为参数传递使用时,形参要定义为数组指针的形式。一维数组的数组名是指向单个变量的指针。二维数组的数组名是指向单个数组的指针。

二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 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);