大警告:我通常不会这样处理多维数组。
我想这只是为了检查,但这:
#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]
也是如此。
为什么这是一个更好的方法?那么,如果你喜欢,你可以有可变大小的子数组。你所要做的就是改变for循环。这种技术经常用于字符串数组,特别是在应用程序的int main(int argc, char** argv)
签名中。 argv
是一个可变长度字符串数组的数组。使用strlen()
来确定它们的长度。
你能通过吗?当然。你刚刚收到它的主,对于初学者,但你也可以写你的函数签名如下所示:
int foo(char** ar2d, const unsigned int size);
,并称之为:
char** somearray;
/* initialisation of the above */
foo(ar2d, thesizeofar2d);
/* when done, free somearray appropriately */
只是要清楚,你包括尺寸参数的方法(如const unsigned int size
)是非常好的做法,你应该坚持下去。
尝试将指针传递给数组 – 2011-01-20 01:48:48