关于C语言中二维数组传参————————【Badboy】
直接上代码:
#include
void Fun(int *a[],int m,int n)//
{
printf("%d\t",*a);//[0][0]
/*
int e[2][2][2]={8,7,6,5,4,3,2,1};
int *f,***g;
g=e;
f=e;//有警告,但不会报错
printf("%d\n",*f);
*/
}
/*解释:
Fun()中的int *a[2]表示定义指针数组a[2],a[0],a[1]存储的都是指针,
a表示的是数组的首地址,所以相当于二级指针。(解释了实参为什么要是二级指针)
a既然是指针,赋值时,实参的指针值复制给a,于是*a就表示a[0][0];
指针的等级只能说明指针的多级指向也是指针,传参时会检查指针等级是否匹配
但指针存储的都是地址值,地址值改变以后,如指向存储int型数据的存储空间,那么
前面加*就表示的便是这个int型数
不同等级的指针之间可以赋值。(解释了*a=4,但**a是错的)*/
void Fun1(int (*a)[],int m,int n)//int **a会有警告
{
printf("%d\t",**a); //int (*a)[2]可以完全用数组来操作
//int (*a)[] 只能用指针来操作数据
}
/*如果为int (*a)[];数组指针,指向数组的指针,二级指针;
表示数组a[]的地址,老谭称之为"行指针"*/
int main()
{
int a[3][2]={4,5,6,1,2,3};
Fun((int **)a,3,2);//
Fun1(a,3,2);//(int **)
return 0;
}
总结:
1.函数传参:形参就是对实参的简单复制
2.数组传参不能检查数组的长度(定义的大小)
3.二维数组传参(多维数组可以转化为二维或一维数组):
1.强制转化为一维指针,一维数组
2.通过行指针
3.强制转化为二维指针(没有意义)。传参之后都只能通过指针寻址访问,数组形式不再适用。
所以如果行数和列数都不确定的二维数组传参没有必要变成二维数组。因为传参以后也要按照一维数组的方式进行寻址,所以不如直接强制转化为一维数组。
对于列数确定的二维数组可以传参转化为二维数组。
如形参定义为int a[][6]; 传参之后还可以像原来的实参一样,通过数组的形式访问,很方便。
4.数组以非引用类型的传递时,此时数组会自动转换为同类型的指针,即初始化为相应类型实参的副本。
调用函数时,函数实际操作的是指针的副本,而不会修改实参指针的值,但是可以通过指针改变数组元素的值。--来自网络
//我的观点:引用传递也是简单的复制,只不过是多了一级指针,可以通过指针操作目标数据(验证后看来是对的)
引用传递:(来自百度百科)
在C++中,函数参数的传递方式有引用传递。
所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中队参数所进行的修改,将影响到实际参数。
5.参数传递:
在完成一定功能的函数,参数传递时,如果需要改变实参,最好通过引用传递实现对实参的操作和改变。返回值最好用来返回函数的执行状态 ,以方便在调用函数中检查被调用函数的执行情况,并进行提示。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。