1, 形参为二维数组, 并给定第二维长度
此方法是最简单最直观的方法,形参与实参一样,容易理解。
int arr[][3]
以杨氏矩阵查找问题为例
int findNumInYangTableau(int arr[][3], int rows, int cols, int num)
{
if(arr != NULL && rows > 0 && cols > 0)
{
int row = 0;
int col = cols - 1;
while(row < rows && col > 0)
{
if(num == arr[row][col])
{
printf("num = (%d, %d)\n", row, col);
return 1;
}
if(num > arr[row][col])
{
++row;
}
else
{
--col;
}
}
}
return 0;
}
int main()
{
int arr[3][3] = {
{1, 2, 3},
{2, 3, 4},
{3, 4, 5},
};
int ret = findNumInYangTableau(arr, 3, 3, 4);
printf("ret expected 1, actual %d\n", ret);
return 0;
}
2, 形参为指向数组的指针, 并给出数组长度
int (*arr)[3]
int findNumInYangTableau(int (*arr)[3], int rows, int cols, int num)
{
if(arr != NULL && rows > 0 && cols > 0)
{
int row = 0;
int col = cols - 1;
while(row < rows && col > 0)
{
if(num == arr[row][col])
{
printf("num = (%d, %d)\n", row, col);
return 1;
}
if(num > arr[row][col])
{
++row;
}
else
{
--col;
}
}
}
return 0;
}
3, 形参为指针的指针
此方法实参必须为指针,而不能为数组名
int findNumInYangTableau(int** arr, int rows, int cols, int num)
{
...
}
int main()
{
int array[][3] = {
{1, 2, 3},
{2, 3, 4},
{3, 4, 5},
};
int* a[3];
a[0] = array[0];
a[1] = array[1];
a[2] = array[2];
int ret = findNumInYangTableau(a, 3, 3, 4);
//这里传(array, 3, 3, 4)会报错
}
还有一种表示
void subfun(int n, char **subargs)
{
int i;
for (i = 0; i < n; i++)
{
printf("subargs[%d] = %s\n", i, subargs[i]);
}
}
char* arg[] = {
"abc",
"cde",
"efg",
};
//这种写法和上面的等价
char* b[3];
b[0] = arg[0];
b[1] = arg[1];
b[2] = arg[2];
subfun(3, arg);
subfun(3, b);
但是如果是 int 数组就不适用了
编译会报警告, 运行后会段错误
但是int 数组这样写可以
int array[][3] = {
{1, 2, 3},
{2, 3, 4},
{3, 4, 5},
};
int* a[3];
a[0] = array[0];
a[1] = array[1];
a[2] = array[2];
方法四:形参为指针+数组的行+数组的列
int findNumInYangTableau(int* arr, int rows, int cols, int num)
{
if(arr != NULL && rows > 0 && cols > 0)
{
int row = 0;
int col = cols - 1;
while(row < rows && col > 0)
{
if(num == arr[row*cols + col])
{
printf("num = (%d, %d)\n", row, col);
return 1;
}
if(num > arr[row*cols + col])
{
++row;
}
else
{
--col;
}
}
}
return 0;
}
int main()
{
int array[][3] = {
{1, 2, 3},
{2, 3, 4},
{3, 4, 5},
};
int ret2 = findNumInYangTableau((int*)array, 3, 3, 4);
}
注意这种方法, 如果这个二维数组的空间是 malloc 或者 new出来的, 那么可能会出现异常, 因为malloc 或 new 出来的内存不一定是连续的
而这种方法arr[row*cols + col]
, 是在访问连续内存