1.以二维数组的形式传递
但是只给出第一维度,第二维度作为参数传递
void function(int a[][3], int maxrow){
int i,j;
for(i=0;i<maxrow;i++){
for(j=0;j<3;j++){
printf("%d",a[i][j]);
printf("%d",*(*(a+i)+j));
printf("%d",*(a[i]+j));
printf("%d",*((int*)a+i*3+j));
}
}
}
2.传递一个数组指针
即传递行指针,附带一维维度,参数传递为二维维度
数组指针:指针,指向一个数组
指针数组:数组,数组里的元素都是指针int *a[3] -> (int *)a[3]
这里多说下行指针和列指针
行指针:指向一维数组,也就是二维数组中每一行的首地址(如p=a[0])
列指针:指向数组中具体的某个元素,如p=&a[0][2]
再说下传递二维数组行指针和一维数组的区别
一维数组传递方式:
void function(int a[],int size); //或int a[10]
void function(int *a);
这里传递的是一个int类型的指针,指向的是数组的首地址,但本质还是指向一个int的数
所以我们传递的不是一整个数组,而是该数组的首地址,我们通过移动指针来访问数组,二维数组也是一样,只不过是一行一行的移动
void function(int (*a)[3])
这里传递的是一个指向有三个元素的一个数组的指针,该指针里的地址是二维数组的首地址,而数组里的每个元素都是int型的
为什么要传一个列数而不是传递行数呢,我一开始一度以为void function(int (*a)[3])里面的3是行数,但是是列数,可以这样理解,我们知道指针运算是以该指针的类型所占字节为移动单位的,而对于一个二维数组在计算机中是一行一行的存的,我们对a[0]+1得到的就能是第二行的首地址,移动了三个int单位,就是给出的列数
void function(int (*a)[3],int maxrow){
int i,j;
for(i=0;i<maxrow;i++){
for(j=0;j<3;j++){
printf("%d",a[i][j]);
printf("%d",*(*(a+i)+j));
printf("%d",*(a[i]+j));
printf("%d",*((int*)a+i*3+j));
}
}
}
3.传递指针的指针
可以不给出列数,但是一定要给出行数
void function(int **a,int maxrow){
int i,j;
for(i=0;i<maxrow;i++){
for(j=0;j<maxcol;j++){
printf("%d",*((int*)a+i*maxcol+j));
}
}
}
计算数组行数与列数公式如下:
maxrow=sizeof(a)/sizeof(a[0]);
maxcol=sizeof(a[0])/sizeof(a[0][0]);