二维及多维数组与指针详解

1.二维数组

  上篇博文讲解了关于一维数组以及指针的运用对一维数组及指针运用还存在疑惑的同学可以查看上篇教程.一维数组及指针运用详解

  本篇文章将要介绍二维数组.二维数组与一维数组原理类似.如二维3x3数组的声明定义.例如int data[2][3]={{1,2,3},{4,5,6}}(注意内部的标点符号);必须牢记,数组名被视为其地址.就像一维数组一样,比较难处理的就是如何正确声明指针.下面的代码遍历了二维数组的所有元素.多维数组类似.倘若该处data声明为int data[4][3]={{1,2,3},{4,5,6}};而我们只给前两行元素赋值,其余值会被默认为0;

#include<iostream>
int main()
{
  	using namespace std;
  	int data[2][3]={{1,2,3},{4,5,6}};	
	for(int i=0; i < 4; i++)
	{
		for(int j=0; j<3; j++)
		{
			cout<<data[i][j]<<endl;//使用**data可以访问data[1][1],*(*(data+1)+2)可访问data[1][2]
		}
	} 	
	return 0;
}	

  在遍历时,同样可以选择**data的方式来遍历,例如使用**data可以访问data[0][0],*(*(data+1)+2)可访问data[1][2],因为数组是一块地址连续的内存.具体讲解请看下面。

1.1二维数组作为形参

假设进行二维数组的求和,需要编写一个数组求和函数,将二维数组作为形参.

void sum(int array[ ][3], int n )//使用int (*array)[3]可替代int array[][3]
{
	using namespace std;
	int sum;
	for(int i=0; i < n; i++)
	{
		for(int j=0; j<3;j++)
		{
			sum+=array[i][j];
		}	
	} 	
} 

可以选择int[][3]的形式作为参数,列数必须固定.或者选择int (*array)[3],括号必须带上,这里又涉及到数组指针以及指针数组.

  数组指针强调的是指针,即指向数组的指针.而指针数组强调的是数组,指包含若干个指针的数组.例如 int *array[3]表示为一个由3个指向int的指针组成的数组. 我们需要的是一个指向由3个int组成的数组的指针,即int (*array)[3].个人建议选择int array[][3]作为函数参数,这样可读性更强,不易出错.

1.2访问二维数组元素

  在文章开始,我们通过int data[i][j]的方式遍历二维数组元素.data[3][4]={{1,2,3},{4,5,6}}; ,这里data是一个数组名,该数组有3个元素,每一个元素本身也是一个数组,由4个int值组成.

  为了深入了解指针,我们向二维数组内部深入探索.一步一步来解析

  data  表示数组名,也是数组第一个元素(4个int构成数组)的地址,而第一行数组的地址也就是(4个int元素的第一个元素的地址) ,即data=&data[0][0]

  data+i 表示指针,它指向第i行元素(4个int构成的数组),由于数组名代表第一个元素.所以**(data+1)表示 data[1][0] ,*(*(data+1)+2)表示data[1][2].*(data+1)加上括号后,data+1比*优先,因此变量从data首行数组的地址右移到下一行数组地址,随后*取值符进行取值.此时*(data+1)表示该行第一个元素的地址.再次使用*,可访问到data[1][0];

总结:

data是指向第一个数组的指针,即指向{1,2,3}的指针;

data+r是指向第r行的指针.例如data+1就是指向{4,5,6}的指针;

*(data+r)表示第r行数组,是第r行数组.由一维数组可知,数组名同时也是第一个元素的地址,*(data+r)=&data[r][0]

*(data+r)+c是指向第r行第c个元素的指针,即*(data+r)+c=&data[r][c]

*(*(data+r)+c)是对上述*(data+r)+c的取值,即*(&data[r][c]),等于data[r][c].

以上就是个人的近些天来学习的一些见解,若存在不对的地方请大家多多指教.

猜你喜欢

转载自blog.csdn.net/weixin_41399111/article/details/82557692