今天看见了四种方式://夜晚回来后,又仔细查了资料发现,这个问题还真是个问题,我总结了下总共有八种方式,这里再继续添加四种,重在理解原理。
>>>数组参数传递中的一些问题
最常用的方式
1 、 f(int (*p)[4],int n);
int a[3][4];
f(a,n);
2、f(int p[][4],int n)//这里p[]相当于*p
int a[3][4];
f(a,n);
//前两种方式是最为推荐的
3、f(int p[4][4],int n)//这里的p[4][4]中第一个位置编译器将默认为[],相当于这种情况与第三种是等价的,编译器默认忽略第一个位置的4
int a[3][4];
f(a,n);
4、f(int **p,int row,int col);
int a[3][4];
f((int**)a,3,4);
里面用a[i][j]的时候要写成
*((int *)a+i*row+j)
5.、f(int [][4],int n)
int a[3][4];
f(a,n);
//同类型3,只是可以省略名称
6、c99特性中增加了可以使用vla,即变长数组,所以可以如下声明
f(int rows,int cols,int a[rows][cols]);
其中rows,cols,分别是其后a数组的行和列。
这里变长数组,不是说创建之后,可以修改其大小、变长数组在声明后大小是不变的,变的意思是,它的维数可以有变量来指定。
所以如下声明是错误的,
f(int a[rows][cols],int rows,int cols);//顺序错误
7、c99中规定,可以省略函数原型中的名称,但是如果省略名称,则需要用星号来替代省略的维数。
f(int ,int ,int a[*][*]);
8,可以利用自定义类型
typedef int arr4[4];
typedef arr4 arr3X4[3];
f(arr3x4 ar,int rows);
一般地,声明N维数组的指针时,除了最左边的方括号可以留空之外,其他的都要填写上数值
这是因为首方括号表示这是一个指针,而其他方括号描述的是所指向对象的数据类型。
int f(int ar[][12][20][130],int rows);
int f(int (*ar)[12][20][130],int rows);
此处ar是指向一个12x20x130的int数组。
//test array
#include<stdio.h>
#include<stdlib.h>
void test_01(int (*p)[4],int times){
printf("It is the %d test.\n",times);
for(int i=0;i<3;i++){
for(int j=0;j<4;j++)
printf("%d ",p[i][j]);
printf("\n");
}
}
void test_02(int p[][4],int times){
printf("It is the %d test.\n",times);
for(int i=0;i<3;i++){
for(int j=0;j<4;j++)
printf("%d ",p[i][j]);
printf("\n");
}
}
void test_03(int p[3][4],int times){
printf("It is the %d test.\n",times);
for(int i=0;i<3;i++){
for(int j=0;j<4;j++)
printf("%d ",p[i][j]);
printf("\n");
}
}
void test_04(int **p,int row,int col,int times){
printf("It is the %d test.\n",times);
for(int i=0;i<3;i++){
for(int j=0;j<4;j++)
printf("%d ",*((int *)p+i*col+j));
printf("\n");
}
}
int main(){
int a[3][4];
for(int i = 0;i < 3;i++){
for(int j=0;j < 4;j++)
a[i][j]=i+1;
}
for(int i=0;i<3;i++){
for(int j=0;j<4;j++)
printf("%d ",a[i][j]);
printf("\n");
}
printf("Initnation is prossing .....");
system("pause");
test_01(a,1);
test_02(a,2);
test_03(a,3);
test_04((int **)a,3,4,4);
system("pause");
}