c语言调用二维数组的函数 c语言二维数组函数的使用方法

如何通过函数调用二维数组

C语言编程的过程中,不可避免的会碰到二维或二维以上的数组作为函数的形参的情况,在以前的编程过程中,习惯了动态数组的应用,很是使用直接定义高维数组。最近在编程的过程中就碰到了这个问题:有如下的测试程序:

成都创新互联技术团队10多年来致力于为客户提供网站设计、网站建设成都品牌网站建设成都全网营销推广、搜索引擎SEO优化等服务。经过多年发展,公司拥有经验丰富的技术团队,先后服务、推广了千余家网站,包括各类中小企业、企事单位、高校等机构单位。

voidtest(double  **x,int Row,int Col);

voidtest(double  **x)

{

for(int i=0;iRow;i++)

for(int k=0;kCol;k++)

x[i][k] += 100.0;

}

intmain(int argc, char *argv[])

{

/*

double **x;

x = new double *[3];

for(int i=0;i3;i++)

x[i] = new double[3];

*/

double x[3][3];

for(int i=0;i3;i++)

for(int k=0;k3;k++)

x[i][k] = i*k;

test(x,3,3);

for(int i=0;i3;i++)

for(int k=0;k3;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);

对于多维数组作为参数,除第一维之外的其它维必须指定维数,否则是肯定编译不过去的。

从上面的对直接定义的数组的引用情况看,直接定义的数组的使用比较麻烦,一旦直接定义数组的维数发生变换,函数的定义必须相应的修改,否则程序就会出错,这也增加了程序进一步开发的麻烦,为了一劳永逸的解决这个问题,建议还是使用动态数组的方法,虽然需要手工释放内存,但是除却了后续的麻烦。

C++函数调用二维数组

n如果是变量的话,数组编译时都通不过吧。数组分配时必须知道大小。

函数应该这样声明function(char array[10][10])或省略第一维的大小function(char array[][10])

function(char array[n][n])这样是错误的,数组的索引必须是个常量表达式

如果需要必须有cin决定大小,那就应该是动态分配的二位数组

char ** aa;

int n;

cinn;

aa = new char *[n];

for ( int i=0;i n;i++ )

aa[i] = new char [n];

这样给函数传递参数function((char**)array),但这样在实际的函数调用是,我们就要进行强制转换才可以用;在函数调用时,要把数组形式写成指针形式如*((int*)array + n*i + j);直接写char array[i][j]会导致错误,编译可以通过,在VC编译器中执行会出现异常

建议楼主直接用vector容器,vectorvectorchar 或vectorstring

C语言二维数组的函数调用

函数调用不能这么用,第36行。C标准里面返回值是不能直接返回一个数组的,只能返回数组的首地址。输出学生成绩和每科成绩那个函数,你可以定义一个全局变量数组,还有求平均值最好用float 或者double,用int会造成精度流失。帮你调试了一下,大概就这样吧

新闻名称:c语言调用二维数组的函数 c语言二维数组函数的使用方法
URL标题:https://www.cdcxhl.com/article26/ddiisjg.html

成都网站建设公司_创新互联,为您提供网站导航营销型网站建设微信小程序全网营销推广面包屑导航网站维护

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都定制网站建设