重要警告:我通常不会以这种方式处理多维数组。
我只是为了检查而尝试了这个:
#include <stdio.h>
int foo(char b[][7])
{
printf("%d\n", b[3][4]);
return 0;
}
int main(int argc, char** argv)
{
char multi_d_arr[20][7];
multi_d_arr[3][4] = 42;
foo(multi_d_arr);
return 0;
}
使用gcc -Wall
编译和运行时没有任何问题。老实说,我不确定第二个参数怎么可能被认为是不兼容的指针类型。工作得很好。
然而,既然你问了,我该如何处理二维数组呢?更好的方法是像这样使用指针:
char** array2d = malloc((MAX_i+1)*sizeof(char*));
for ( i = 0; i < (MAX_i+1); i++ )
{
array2d[i] = malloc((MAX_j+1)*sizeof(char));
}
现在,为了更清楚明白,您可以访问的最大元素是array2d[MAX_i][MAX_j]
。
完成后不要忘记反转过程:
for ( i = 0; i < (MAX_i+1); i++ )
{
free(array2d[i]);
}
free(array2d);
现在,使用这种方法,下标表示法仍然有效,因此
array2d[x][y]
仍然可以访问正确的值。从字面上讲,
array2d
是指针数组,每个
array2d[i]
也是如此。
为什么这是一种更好的方法?因为你可以拥有大小可变的子数组(sub-arrays),只要改变for循环即可。这种技巧经常用于字符串数组中,特别是在应用程序的
int main(int argc, char** argv)
签名中。
argv
是一个包含长度可变的字符串的数组的数组。使用
strlen()
来确定它们的长度。
你能传递这个吗?当然可以。你刚刚在main函数中接收到它,但你也可以将你的函数签名写成这样:
int foo(char** ar2d, const unsigned int size);
并将其命名为:
char** somearray;
foo(ar2d, thesizeofar2d);
需要明确的是,您包含大小参数的方法(例如const unsigned int size
)非常好,您应该坚持使用它。