现在的位置: 首页 > 综合 > 正文

C/C++ 二维数组作为函数参数

2013年09月19日 ⁄ 综合 ⁄ 共 714字 ⁄ 字号 评论关闭

有两种类型的二维数组:

维数固定

这一类的数组存放在栈上,是连续存储的。任意维度固定的多维数组都可以看做是一维数组,可以用a[i+j*n]的形式来访问。

int ia[2][2] = {2,3,4,5}; //4个元素时连续排列的内存段

//void f(int p[][2], int row, int col )//这种方式必须事先知道除第一维以外的维度的大小,不灵活
void f(int *p , int row, int col )//转化为一维数组来访问
{
	for(int i = 0; i < row; i++)
	{
		for(int j =0 ;j < col; j++)
		{
			cout<<p[i*col+j]<<" ";
		}
	}
	cout<<endl;
}

下面的代码是错误的:

int ** p= ia;//ia的类型是char (*)[2],而不是**int

这是因为,**p指向首地址,因为int   **p一次解引用为地址指针,而非堆上的指向数组的指针,所以二次解引用会出错。 

动态数组

这类数组存放在堆上。只有每行内是连续排列,各行并不一定连续排列。

int   **p   =   new   int*[2];         //只有每行内是连续排列,各行并不一定连续排列 
for   (   int   i   =   0;   i   <   2;   i++   ) 
{ 
	p[i]   =   new   int[2]; 
} 
for   (   int   i   =   0;   i   <   2;   i++   ) 
{ 
	for   (   int   j   =   0;   j   <   2;   j++   ) 
	{ 
		p[i][j]   =   ia[i][j]; 
	} 
}

这类数组的访问,可以传递多维指针(这里是二维**p)和维度,直接用a[i][j]访问。

void f(int **p , int row, int col )
{
	for(int i = 0; i < row; i++)
	{
		for(int j =0 ;j < col; j++)
		{
			cout<<p[i][j]<<" ";
		}
	}
	cout<<endl;
}

抱歉!评论已关闭.