您的位置:首页 > 编程语言 > C语言/C++

二维数组作为参数的函数定义及调用方法

2015-09-16 17:08 288 查看
        栈上分配的数组和堆上分配的数组在内存排列上可能不相同,直接定义的数组是存储在程序的堆栈区,数据占用连续的区间;而动态申请的数组是在系统的远堆上(far heap),除最后一维的元素是连续存放的外,其他维上的元素有可能不是在一块连续的内存区域里。

        如下所示:

        //栈上: 
        int   ia[2][2]   = {2,3,4,5};    //4个元素是连续排列的内存段 
        //堆上: 
        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];
}
}  
      所以对栈上的数组用int  **p指向首地址,因为int  **p一次解引用为地址指针,而非堆上的指向数组的指针,所以二次解引用会出错。 
        如果找一个通用方程只能用:
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 * row + j] < < " ";
}
cout < < endl;
}
}

int main(){
//.........
int ia[2][2] = {2,3,4,5};
f( (int*)ia, 2, 2 );
}

采用上面的通用办法还是比较麻烦,这无形中对编程增加了难度,为了避免这个麻烦可以采用动态数组的形式,将原来采用直接定义的数组全部换成动态数组,类似开头例子中被注释掉的那部分代码,当然这样也有后续的麻烦,动态数组的生命周期完成后必须释放内存空间,这也有点罗嗦,但是毕竟可以直接使用数组的形式,比上面的通用方式还是要简单一点。

如果执意要使用直接定义的数组该怎么办呢?有如下几种方法:

方法一:

voidtest(double  (*x)[3], int Row, int Col);

调用方式:test(x,Row,Col);
方法二:

voidtest(double  x[][3], int Row,int Col);

调用方式 test(x,Row,Col);
对于多维数组作为参数,除第一维之外的其它维必须指定维数,否则是肯定编译不过去的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 二维数组