1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!
偶然间发现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;
}
除此之外,还有一下几种定义方法:
(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) //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]);
}
}
}
以上就是关于二位数组的一点笔记,如有错误欢迎指出!