直接上代码:
#include
void Fun(int *a[],int m,int n)//
{
printf("%d ",*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 ",*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 ",**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.參数传递:
在完毕一定功能的函数,參数传递时,假设须要改变实參,最好通过引用传递实现对实參的操作和改变。返回值最好用来返回函数的运行状态 。以方便在调用函数中检查被调用函数的运行情况,并进行提示。