二维数组作形参(以二维数组int a[4][3]为例),且在函数调用中可以通过a[i][j]的方式获取二维数组中个各值,可以有两种方式:
1. 使用二维数组作形参
void fun_test2(int ppArr_test[][3]);
或
void fun_test2(int ppArr_test[4][3])
注:
①二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:
void fun_test2(int ppArr_test[][])
②若采用void fun_test2(int** ppArr_test)这种方式,则函数内不能ppArr_test[i][j]方式获取数组值,会导致编译错误;可采用如下方式进行读值((int)ppArr_test+ n*i + j)。
原因:就在于如果写成ppArr_test[i][j],编译器无法正确的寻址,当然各种编译器对它的处理结果是不一样的。如果我们的形参是数组,那么我们在函数体中可以用指针也可以用数组形式,但是如果我们形参数中用的是指针,最好也用指针,有时用数组形式会出错。
2.使用二维指针作形参
void fun_test1(int (*pArr_test) [3])
注:int (*pArr) [3]定义的数组指针,可以通过直接与数组名相等的方式来指向二维数组。
3. 代码示例
#include <stdio.h>
#include "stdlib.h"
//使用二维数组指针作函数形参
void fun_test1(int (*pArr_test) [3])
{
printf("\n\r");
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
printf("pArr_test[%d][%d] = %d ", i, j, pArr_test[i][j]);
}
printf("\n\r");
}
}
void fun_test2(int ppArr_test[][3])
{
printf("\n\r");
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
printf("ppArr_test[%d][%d] = %d ", i, j, ppArr_test[i][j]);
}
printf("\n\r");
}
}
int main(void)
{
int a[4][3] = {
{1, 2, 12},
{3, 4, 34},
{5, 6, 56},
{7, 8, 78}};
int (*pArr) [3]; //一定要加上括号,因为[]的优先级高于*
pArr = a; //重要!!!!!
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
printf("pArr[%d][%d] = %d ", i, j, pArr[i][j]);
}
printf("\n\r");
}
printf("\n\r");
printf("a = %d \n\r", a);
printf("pArr = %d \n\r", pArr);
printf("pArr[0] = %d \n\r", pArr[0]);
printf("&a[0][0] = %d \n\r", &a[0][0]); //以上四个值都是相同的,都可以用来表示二维数组的首地址值
fun_test1(pArr);
printf("\n\r");
fun_test2(pArr);
printf("\n\r");
system("pause");
return 0;
}
注:此代码是在DEV C++环境下运行。