注意:偏离所请求的array-of-pointers-to-rows 语法并直接指向数组中的行,正如@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 *)。
根据建议的定义,锯齿状数组是指向锯齿状行的指针数组,同样简化后,可以将其视为unsigned ** 的数组。
当您索引第一个维度时,您将获得指向锯齿行(数组)的指针,然后您必须取消引用该指针以获取作为锯齿行的数组本身,而不是索引此数组达到最终值。