c++里二维数组怎么传值给函数?格式是怎么样的?

c++里二维数组怎么传值给函数?格式是怎么样的?,第1张

ls几个真是太不负责任了, 想当然的int
为什么不自己亲自try it
一般来说数组的传递方法应该是这种形式的
void function(type arrayName[][a][b][c]){
}
如果是一维数组 void F(type N[]) (简写)
二维 void F(type N[][a]) ,这里a是一个数
以此类推
lz这里就应该是void gaibian(int b[][2])
我们平时经常可以看到void F(type N)这样的形式,用来传递数组。
然而实际上这只是种取巧的手段,因为数组某种程度上和指针是等价的。
上面那种形式的真正意义应该是“传递指针”。
应该再明确一点:
是数组的名字和指针变量的 *** 作方式很相似。
譬如int a[10], 与 int a;
都可以用 (a+i) 与 a[i] 这两种索引方法
如果对于多维数组就不完全一样了
譬如int a[10][10]; int b;
b=a;
那么 a[i][j] 与 b[10i+j]是相等的。
因此lz的函数也可以改成这样子:
void gaibian(int b)
{
b[02+0]=1;
b[02+1]=2;
b[12+0]=3;
b[12+1]=4;
}
编译可以通过, 但会受到一个警告“int ”与“int [2][2]”的间接级别不同
Whatever, 数组参数绝对不应该有type 这种类型
刚才看资料, 发现还有一种形式, 应该说更接近本质的形式
void function(type (arrayName)[a][b][c]){
}
它与
void function(type arrayName[][a][b][c]){
}
不同之处就是arrayName[]换成了(arrayName)
意思都差不多, 效果也差不多。

函数原型 type fun (type (name)[size])\x0d\ \x0d\type是你要定义的类型,fun是函数名,name是在函数中二维数组的名字,\x0d\size是二维数组第2维的长度。\x0d\这样调用这个函数只需要把二维数组函数名传递就可以了。

C语言编程的过程中,不可避免的会碰到二维或二维以上的数组作为函数的形参的情况,在以前的编程过程中,习惯了动态数组的应用,很是使用直接定义高维数组。最近在编程的过程中就碰到了这个问题:有如下的测试程序:
voidtest(double  x,int Row,int Col);
voidtest(double  x)
{
         for(int i=0;i<Row;i++)
                   for(int k=0;k<Col;k++)
                            x[i][k] += 1000;
}
intmain(int argc, char argv[])
{
/
         double x;
        x = new double [3];
        for(int i=0;i<3;i++)
         x[i] = new double[3];
/
    double x[3][3];
         for(int i=0;i<3;i++)
                   for(int k=0;k<3;k++)
                            x[i][k] = ik;
         test(x,3,3);
         for(int i=0;i<3;i++)
                   for(int k=0;k<3;k++)
                            printf("x[%d][%d]= %e\n",i,k,x[i][k]);
        getch();
         return 0;
}
编译时提示Cannot convert 'double [][3]' to double '。
将调用方式强制进行类型转换:test((double )x),编译通过,运行出错,提示非法越界。
据传:因为栈上分配的数组和堆上分配的数组在内存排列上可能不相同,直接定义的数组是存储在程序的堆栈区,数据占用连续的区间;而动态申请的数组是在系统的远堆上(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);
调用用方式 test(x,Row,Col);
方法二:
voidtest(double  x[][3], int Row,int Col);
调用方式 test(x,Row,Col);
         对于多维数组作为参数,除第一维之外的其它维必须指定维数,否则是肯定编译不过去的。
         从上面的对直接定义的数组的引用情况看,直接定义的数组的使用比较麻烦,一旦直接定义数组的维数发生变换,函数的定义必须相应的修改,否则程序就会出错,这也增加了程序进一步开发的麻烦,为了一劳永逸的解决这个问题,建议还是使用动态数组的方法,虽然需要手工释放内存,但是除却了后续的麻烦。

我不明白,如果两个维度都不是事先确定,你上面要怎么定义?
arr[][4];
好吧,如果你说的那个可行
那就传那两个维度进去。
前面arr[i][j]
那么就void func(int i,int j,int num)
我不敢保证在func里面使用到arr[][]的时候貌似能直接使用arr[i][j],我记得这样用会出错。
所以你要运算那个地址。
你想要的比如是5行4列的 arr[5][4]
你要第第二行第二个数
那么就要(arr+(2-1)4+2),这样来得到数字
如果你事先就知道这个维度的话,
直接设定个全局变量
然后连数组都不用传进去就可以直接运算的。
数组是记录地址的,会直接修改在原来的地方

很简单的,数组作为函数参数传递的时候只要是数组名就可以了,因为数组名本身就是数组的首地址 给个程序看看
#include<stdioh>
#define N 3
int array[N][N];
void main()
{
//在主函数内声明被调函数
void convert(int array[][3]);
int i,j;
printf("输入数组:\n");
for(j=0;j<N;j++)
for(i=0;i<N;i++)
scanf("%d",&array[i][j]);
printf("\n");
for(j=0;j<N;j++)
{
for(i=0;i<N;i++)
printf("%d\t",array[i][j]);
printf("\n");
}
//调用矩阵转置函数
convert(array);
printf("\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%d\t",array[i][j]);
printf("\n");
}
}
void convert(int array[][3])
{
int i,j,t;
for(i=0;i<N;i++)
for(j=0;j<N;j++)//设置数组中转置矩阵元素交换
{
t=array[i][j];
array[i][j]=array[j][i];
array[j][i]=t;
}
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13323797.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-15
下一篇 2023-07-15

发表评论

登录后才能评论

评论列表(0条)

保存