2024年10月二维数组函数(C语言中如何将二维数组作为函数的参数传递)
⑴二维数组函数(C语言中如何将二维数组作为函数的参数传递
⑵C语言中如何将二维数组作为函数的参数传递
⑶在C语言中可以用二维数组作为实参或者形参。
⑷函数中用二维数组作为形参,函数声明中可以指定所有维数的大小,也可以省略第维的维数如:
⑸void?f(int?array);?//正确?????void?f(int?array);??//正确
⑹上面的两种二维数组形参表示都是正确的。
⑺函数中用二维数组作为形参,不能把第维或者更高维的大小省略,如下面的定义是不合法的:
⑻void?f(int?array);?//错误
⑼因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列,不能只指定一维而不指定第二维,下面写法是错误的:
⑽void?f(int?array);??//错误
⑾维数组作为实参传递时,必须保证实参第维的维数与形参第维的维数相同,因为必须要保证形参和实参的数据类型一致。比如定义如下函数:
⑿void?f(int?array);
⒀可以将如下数组传递给函数f。
⒁int?a?=?{,,,};?int?b?=?{};
⒂#include《stdio.h》#definea#definebvoidfindMaxandMin(floatscore,intn,float*pMax,float*pMin,int*pMaxNum,int*pMinNum){inti;*pMax=score;*pMin=score;*pMaxNum=;*pMinNum=;for(i=;i《=n;i++){if(*pMax《score){*pMax=score;*pMaxNum=i;}if(*pMin》score){*pMin=score;*pMinNum=i;}}}voidmain(){floatscore,pMax,pMin;inti,o,n,pMaxNum,pMinNum;printf(“请输入学生人数:
⒃“);scanf(“%d“,&n);printf(“请输入学生的科成绩以语文,数学,英语,X科,综合基础输入:
⒄“);for(i=;i《=n;i++){printf(“%d:“,i);for(o=;o《;o++)scanf(“%f“,&score);}for(i=;i《=n;i++)score)/;findMaxandMin(score,n,&pMax,&pMin,&pMaxNum,&pMinNum);printf(“平均分最高的是%d,其平均分为%f
⒅“,pMaxNum,pMax);printf(“平均分最低的是%d,其平均分为%f
⒆“,pMinNum,pMin);scanf(“%d“,&n);}这个应该是统计班里学生成绩最高分跟最低分的简单程序吧,我已经做了一些修改,希望能帮上点小忙~~
⒇c语言中怎么用二维数组作为函数参数
⒈二维数组作为函数参数,实参可以直接使用二维数组名,在被调用函数中对形参数组定义可以指定所有维数的大小,也可以省略第一维的大小说明,如:
⒉它们是合法且等价,也可以使用如下形式:
⒊但不能省略第二维的大小,如下面的定义是不合法的,编译时会出错:
⒋因为从实参传递来的是数组的起始地址,如果在形参中不说明列数,编译器将无法定位元素的的位置。
⒌C++二维数组函数参数引用
⒍C语言二维数组的函数调用
⒎函数调用不能这么用,第行。C标准里面返回值是不能直接返回一个数组的,只能返回数组的首地址。输出学生成绩和每科成绩那个函数,你可以定义一个全局变量数组,还有求平均值最好用float或者double,用int会造成精度流失。帮你调试了一下,大概就这样吧
⒏函数原型typefun(type(name*))type是你要定义的类型,fun是函数名,name是在函数中二维数组的名字,size是二维数组第维的长度。这样调用这个函数只需要把二维数组函数名传递就可以了。
⒐规则是这样的:向一个函数传递二维数组的时候,可以不指定行数,但是必须指定列数;也就是你可以把这个二维数组看成是由多列组成的数组,每一列是一个一维数组.一个例子:voidfunc_foo(intarry_in,introws);*a:这个二维数组的(存储)起始地址;**a:取第一行第一列的元素值*(a+):取第二行地址*(a+)+:第二行地址上加
⒑C语言中如何将二维数组作为函数的参数传递
⒒函数原型typefun(type(name*))xdxaxdxatype是你要定义的类型,fun是函数名,name是在函数中二维数组的名字,xdxasize是二维数组第维的长度。xdxa这样调用这个函数只需要把二维数组函数名传递就可以了。
⒓c语言中怎么用二维数组作为函数参数
⒔C语言中指针做函数参数传递二维数组有两种基本方法:、传递“数组指针”《pret=“code“l=“cpp“》#include《stdio.h》voidoutput(int(*pa);output(pa,,);}
⒕如何通过函数调用二维数组
⒖C语言编程的过程中,不可避免的会碰到二维或二维以上的数组作为函数的形参的情况,在以前的编程过程中,习惯了动态数组的应用,很是使用直接定义高维数组。最近在编程的过程中就碰到了这个问题:有如下的测试程序:voidtest(double??**x,int?Row,int?Col);voidtest(double??**x){?????????for(int?i=;i《Row;i++)???????????????????for(int?k=;k《Col;k++)????????????????????????????x?+=?.;}intmain(int?argc,?char?*argv){/*?????????double?**x;????????x?=?new?double?*;????????for(int?i=;i《;i++)?????????x;*/????double?x;?????????for(int?i=;i《;i++)???????????????????for(int?k=;k《;k++)????????????????????????????x?=?i*k;?????????test(x,,);?????????for(int?i=;i《;i++)???????????????????for(int?k=;k《;k++)????????????????????????????printf(“x);????????getch();?????????return?;}编译时提示Cannot?convert?’double?’?to?double?**’。将调用方式强制进行类型转换:test((double?**)x),编译通过,运行出错,提示非法越界。据传:因为栈上分配的数组和堆上分配的数组在内存排列上可能不相同,直接定义的数组是存储在程序的堆栈区,数据占用连续的区间;而动态申请的数组是在系统的远堆上(far?heap,除最后一维的元素是连续存放的外,其他维上的元素有可能不是在一块连续的内存区域里。//栈上:?int???ia???=?{,,,};????//个元素是连续排列的内存段?//堆上:?int???**p??=??new??int*;???//只有每行内是连续排列,各行并不一定连续排列?????????for?(?int??i??=?;??i??《?;?i++?)?????????{????????????????p;?????????}???????for?(?int??i??=??;??i??《??;??i++?)?????????{????????????????for?(?int??j??=??;??j??《??;??j++?)????????????????{????????????????????????p;????????????????}?????????}??????????所以对栈上的数组用int??**p指向首地址,因为int??**p一次解引用为地址指针,而非堆上的指向数组的指针,所以二次解引用会出错。?如果找一个通用方程只能用:?void???f(?int??*p,?int??row,??int??col?)?????//给出数组的行和列,对堆上的数组不合适???{?????????for?(?int??i?=??;??i??《??row;??i++)?????????{????????????????for?(?int??j??=??;??j??《?col;??j++?)????????????????{????????????????????????cout?《?《?p?《?《?“???“;???????????????????????????????????????}????????????????cout?《?《?endl;?????????}?}?int???main(){?????//.........?????int???ia???=??{,,,};?????f(?(int*)ia,?,??);?}采用上面的通用办法还是比较麻烦,这无形中对编程增加了难度,为了避免这个麻烦可以采用动态数组的形式,将原来采用直接定义的数组全部换成动态数组,类似开头例子中被注释掉的那部分代码,当然这样也有后续的麻烦,动态数组的生命周期完成后必须释放内存空间,这也有点罗嗦,但是毕竟可以直接使用数组的形式,比上面的通用方式还是要简单一点。?????????如果执意要使用直接定义的数组该怎么办呢?有如下几种方法:方法一:voidtest(double??(*x),?int?Row,?int?Col);调用方式:test(x,Row,Col);调用用方式?test(x,Row,Col);方法二:voidtest(double??x,?int?Row,int?Col);调用方式?test(x,Row,Col);?????????对于多维数组作为参数,除第一维之外的其它维必须指定维数,否则是肯定编译不过去的。?????????从上面的对直接定义的数组的引用情况看,直接定义的数组的使用比较麻烦,一旦直接定义数组的维数发生变换,函数的定义必须相应的修改,否则程序就会出错,这也增加了程序进一步开发的麻烦,为了一劳永逸的解决这个问题,建议还是使用动态数组的方法,虽然需要手工释放内存,但是除却了后续的麻烦。