如何在头文件中声明锯齿状数组?
How to declare a jagged array in a header file?
为了定义锯齿状数组,我使用了@FaisalVasi 的this answer。这非常有效。要获取此类定义数组的 (i,j)- 条目,请键入 (*jagged[i])[j]
。
但是,我喜欢将我所有的数组放在一个单独的文件中(我的常量数组),然后我必须在头文件中声明它们。而我无法做到这一点。我尝试了 **jagged = unsigned[][]
和 *jagged = unsigned*[]
,以及我不记得的其他尝试。无论如何,我尝试过的一切都没有用。那么应该如何在头文件中声明锯齿状数组呢?
我是 C 的新手,希望问题清楚。否则请问我有什么可以澄清的。
C 中的交错数组通常是指向指针数组第一个元素的指针。基本上是指向指针的指针。 IE。 type **jagged
.
要在头文件中声明几乎 任何 变量,请使用 extern
关键字。如
extern type **jagged;
[用实际类型替换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]);
当然,你可以创建一个实际的指针数组(很像上面的第二种情况):
extern type *jagged[];
...
type *jagged[] = { jagged_row_0, jagged_row_1 };
...
printf("jagged[1][0] = %d\n", jagged[1][0]);
当行的大小不同时要非常小心,不要越界。
注意:偏离请求的行指针数组语法并直接指向数组中的行,如@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 中给出的定义,其中锯齿状数组存储指向锯齿状行的显式指针。
定义(在一些 .c 文件中)
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 *
).
的指针
根据建议的定义,锯齿状数组是 指向锯齿状行的指针数组,通过相同的简化,可以将其视为 [=22] 的数组=].
当你索引第一个维度时,你得到的是指向锯齿状行(数组)的指针,然后你必须取消引用这个指针才能到达作为锯齿状行的数组本身,而不是你必须索引这个数组得到最终值。
为了定义锯齿状数组,我使用了@FaisalVasi 的this answer。这非常有效。要获取此类定义数组的 (i,j)- 条目,请键入 (*jagged[i])[j]
。
但是,我喜欢将我所有的数组放在一个单独的文件中(我的常量数组),然后我必须在头文件中声明它们。而我无法做到这一点。我尝试了 **jagged = unsigned[][]
和 *jagged = unsigned*[]
,以及我不记得的其他尝试。无论如何,我尝试过的一切都没有用。那么应该如何在头文件中声明锯齿状数组呢?
我是 C 的新手,希望问题清楚。否则请问我有什么可以澄清的。
C 中的交错数组通常是指向指针数组第一个元素的指针。基本上是指向指针的指针。 IE。 type **jagged
.
要在头文件中声明几乎 任何 变量,请使用 extern
关键字。如
extern type **jagged;
[用实际类型替换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]);
当然,你可以创建一个实际的指针数组(很像上面的第二种情况):
extern type *jagged[];
...
type *jagged[] = { jagged_row_0, jagged_row_1 };
...
printf("jagged[1][0] = %d\n", jagged[1][0]);
当行的大小不同时要非常小心,不要越界。
注意:偏离请求的行指针数组语法并直接指向数组中的行,如@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 中给出的定义,其中锯齿状数组存储指向锯齿状行的显式指针。
定义(在一些 .c 文件中)
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 *
).
根据建议的定义,锯齿状数组是 指向锯齿状行的指针数组,通过相同的简化,可以将其视为 [=22] 的数组=].
当你索引第一个维度时,你得到的是指向锯齿状行(数组)的指针,然后你必须取消引用这个指针才能到达作为锯齿状行的数组本身,而不是你必须索引这个数组得到最终值。