下面讨论一下关于将二维数组作为参数传递的方式:
例一:
#include
int max(int *a)
{
int max;
return 0;
}
int main()
{
int a[3][4];
printf("%d",max(a));
return 0;
}
这里用数组名a作为参数传递给int max(int
*a)这个函数作为实参,在VC6下会有warning,在VS2008下会出现错误,如下:错误 2 error
C2664: “max”: 不能将参数 1 从“char [3][4]”转换为“int
*” 提示不能将二维数组地址转换为一个*的指针。(感觉上VS2008比VC6更不讲理了...)
想要将数组首地址传递给一重指针,可以用下面的方法:
例二:
#include
int max(int *a)
{
int max;
return 0;
}
int main()
{
int a[3][4];
printf("%d",max(a[0]));//&a[0][0]
return 0;
}
不过如果这样传递参数,在max函数中只能将a当成是一维数组使用,而当你用二重指针去引用时,VS2008会报错...
可看下面程序:
例三:
#include
int max(int *a)
{
int max = 0;
int i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(max
max
= *(*(a+i)+j);
//for(i=0;i<12;i++)
// if(max
// max=*(a+i);
return 0;
}
int main()
{
int a[3][4];
printf("%d",max(a[0]));
return 0;
}
此程序无论在VC6还是VS2008下均报错,错误 1 error
C2100: 非法的间接寻址
故此需要将对二维数组的引用改变为对一维数组的引用,即例四:
#include
int max(int *a)
{
int max = 0;
int i,j;
//for(i=0;i<3;i++)
// for(j=0;j<4;j++)
// if(max
// max
= *(*(a+i)+j);
for(i=0;i<12;i++)
if(max
max=*(a+i);
return 0;
}
int main()
{
int a[3][4];
printf("%d",max(a[0]));
return 0;
}
但到目前为止,我们只是绕了捷径将二维数组看作一维数组处理(当然也是被逼的...)
如果要在max函数中将a当做二维数组处理可以这样传递参数,
例五:
int max(int (*a)[4])
{
int max = 0;
int i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(max
max
= *(*(a+i)+j);
//for(i=0;i<12;i++)
// if(max
// max=*(a+i);
return 0;
}
int main()
{
int a[3][4];
printf("%d",max(a));
return 0;
}