要定义锯齿状数组,我正在使用@FaisalVasi的this answer。这非常有效。要获取此类已定义数组的(i,j)-entry,请键入(*jagged[i])[j]
。
但是,我喜欢将所有数组放在一个单独的文件中(我的常量数组),然后我必须在头文件中声明它们。我无法做到这一点。我尝试了**jagged = unsigned[][]
和*jagged = unsigned*[]
以及其他我不记得的尝试。无论如何,我尝试过的一切都没有用。那么我应该如何在头文件中声明锯齿状数组呢?
我是C的新手,我希望问题很明确。否则请问我能澄清什么。
答案 0 :(得分:1)
C中的锯齿状数组通常是指向指针数组的第一个元素的指针。基本上是指向指针的指针。即type **jagged
。
要在头文件中声明任何变量,请使用extern
关键字。如在
extern type **jagged;
[将[{1}}替换为实际类型]
有两种方法可以使用它:
完整动态分配
type
数组数组
jagged = malloc(sizeof(*jagged) * M);
for (unsigned i = 0; i < M; ++i)
jagged[i] = calloc(N, sizeof(**jagged));
// Now jagged is a MxN jagged matrix where each element is zero
jagged[1][2] = 1; // Sets a single value to 1
当然,您可以改为创建指针数组的实际数组(非常类似于上面的第二种情况):
type jagged_row_0[] = { a, b, c };
type jagged_row_1[] = { x, y };
type **jagged = (type *[2]){ jagged_row_0, jagged_row_1 };
printf("jagged[1][0] = %d\n", jagged[1][0]);
虽然拥有不同大小的行但要非常小心,所以你不要超出界限。
答案 1 :(得分:1)
注意:偏离所请求的指针数组到行的语法并指向数组中的行,如@Someprogrammerdude所建议的那样,可以获得相同的结果,但是少了一个间接和一个更清晰的访问语法。
unsigned jagged_row0[] = { 0, 1, 99 };
unsigned jagged_row1[] = { 1, 2, 3, 4, 5, 6, 99 };
unsigned *jagged[] = (unsigned *[]){ jagged_row0, jagged_row1 };
或一般情况下:
type jagged_row0[] = { ... };
type jagged_row1[] = { ... };
...
type *jagged[] = (type *[]){ jagged_row0, jagged_row1, ... };
extern unsigned *jagged[];
或一般情况下:
extern type *jagged[];
unsigned v_i_j = jagged[i][j];
或一般情况下:
type v_i_j = jagged[i][j];
以下解决方案通过@FaisalVasi解决了cited answer中给出的定义,其中锯齿状数组存储了对锯齿状行的显式指针。
unsigned jagged_row0[] = {0,1};
unsigned jagged_row1[] = {1,2,3};
unsigned (*jagged[])[] = { &jagged_row0, &jagged_row1 }; /* note the ampersand */
/* or alternatively, since compound literals are lvalues ... */
unsigned (*jagged[])[] = { &(int[]){0,1}, &(int[]){1,2,3} };
extern unsigned (*jagged[])[];
unsigned *jagged_row;
...
jagged_row = *jagged[i];
unsigned v_i_j = jagged_row[j]; /* value at [i][j] */
或更紧凑:
unsigned v_i_j = (*jagged[i])[j]; /* value at [i][j] */
锯齿状的行是一个基本类型的数组,在我们的例子中是一个无符号(unsigned[]
)的数组(由静态初始化确定的长度),可以想到,作为一个警告,指向无符号(unsigned *
)。
根据提议的定义,锯齿状数组是一个指向锯齿状行的指针数组,它们具有相同的简化,但可以作为unsigned **
的数组。
当您索引第一个维度时,您将获得指向锯齿状行(数组)的指针,然后您必须取消引用此指针以获取到锯齿状行的数组本身,而不必索引此数组达到最终价值。