【易错】C语言二维数组作为函数参数?
大家有构建过二维数组作为函数的参数吗?有没有遇到什么问题呢?现在,我们先来看一个函数:
void func1(int **array, int m, int n)
{
int i = 0, j = 0;
for ( i = 0; i < m; i++ )
{
for ( j = 0; j < n; j++ )
{
//printf("%d ", array[i][j] );
printf("%d ", *(*(array+i)+j) );
}
}
}
函数设计的功能很简单,就是打印输出二维数组中的所有元素。
假如主函数我们设计为:
int main(void)
{
int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
func1((int**)a, 3, 3);
return 0;
}
大家觉得输出结果会是什么呢?结果是什么都没输出。出错原因是因为二维数组作为函数参数时要给出二维长度。但是,是不是就不能使用这个函数了呢?还是可以使用的,只要在主函数中定义一个指针数组作为中间桥梁即可正确输出。
即主函数修改为如下所示:
int main(void)
{
int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
int *p[3];
p[0] = &a[0][0]; //a[0]
p[1] = &a[1][0]; //a[1]
p[2] = &a[2][0]; //a[2]
func1(p, 3, 3);
return 0;
}
定义一个指针数组,该指针数组中的元素分别指向每一行的第一个元素。再把该指针数组作为形参传入func1函数中。
除此之外,还有如下三种方法构造函数:
(1)形参声明为一级指针
void func2(int *array, int m, int n)
{
int i = 0;
for ( i = 0; i < m*n; i++ )
{
printf("%d ", array[i]);
}
}
(2)形参给出二维长度
void func3(int array[][3], int len)
{
int i = 0, j = 0;
for ( i = 0; i < len; i++ )
{
for ( j = 0; j < 3; j++ )
{
printf("%d ", array[i][j]);
}
}
}
(3)形参声明为指向数组的指针(数组指针)
void func4(int (*array)[3], int len)
{
int i = 0, j = 0;
for ( i = 0; i < len; i++ )
{
for ( j = 0; j < 3; j++ )
{
printf("%d ", array[i][j]);
}
}
}
赞 (0)