快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

c语言二维数组函数调用 c++二维数组函数调用

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

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

府谷网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、自适应网站建设等网站项目制作,到程序开发,运营维护。创新互联成立于2013年到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联

C语言,如何在子函数中写一个3*3二维数组,给主函数调用!!

在子函数申请二维数组,主函数使用,可以用动态申请。

方法不止一种,我这里用指针的指针实现二维数组。

二维数组除了行列,本身地址也是连续的,从第一行第一列的元素地址++,可以取出所有元素。所以我这里先申请了完整的连续地址。

#includestdio.h

#includemalloc.h

int ** sr(void)

{

int i,j;

int *memory=(int *)malloc(sizeof(int)*9);//申请完整的连续内存地址3*3

int **arr=(int **)malloc(sizeof(int*)*3);//申请二维数组行指针数组(也就是二维数组)

if(!memory || !arr){

printf("内存申请错误!\n");return NULL;}

for(i=0,j=0;i9;i+=3)//将连续地址按列数,取出每行首地址,赋值给二维数组元素

arr[j++]=memory[i];

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

for(j=0;j3;j++)

scanf("%d",arr[i][j]);

return arr;

}

int main(void)

{

int i,j,**arr=sr();

if(!arr)

return 1;

printf("---主函数调用子函数定义的二维数组---\n");

for(i=0;i3;i++,printf("\n"))

for(j=0;j3;j++)

printf("%d ",arr[i][j]);

printf("\n---实现二维数组地址连续性---\n");

int *p=arr[0][0];

while(p=arr[2][2])

printf("%d ",*p++);

return 0;

}

急求:主函数中的二维数组如何才能在其他函数中被调用(C语言)

正如楼下所言

int

**p

,定义的p是一个指向int*型的指针

int

(*p)[10]是一个指向数组的指针

数组长度为10

假如定义成

deal(int

**p),传参数时要加强制类型转换:

deal((int**)a);

并且使用p时不能用下标,p[2][3]是错误的,因为不知道p指向的int*型的长度,无法编译成*(p+2*10+3)

必须自己写成*(p+2*10+3)来调用

假如定义成

deal(int

(*p)[10])就不一样了,编译器就能知道p是一个指向长度为10的数组的指针

那么p[2][3]就能编译成*(p+2*10+3)了

总之,c语言是很灵活的,不同的定义方式配上不同的用法,都是能得到正确的结果的

不知道这么说楼主明白了没?

同样的还有多维数组对多维指针的问题,楼主可以自己类推一下

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

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

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语言二维数组函数调用 c++二维数组函数调用
文章网址:http://6mz.cn/article/ddscods.html

其他资讯