如何获得数组大小

Joh*_*Doe 5 c arrays

我想知道如何获得数组行和列大小.例如,它将是这样的:

int matrix[][] = { { 2, 3 , 4}, { 1, 5, 3 } }
Run Code Online (Sandbox Code Playgroud)

这个的大小是2 x 3.如何在不包含stdio或stdlib的其他库的情况下计算出来?

Ste*_*hen 10

这有一些相当有限的用途,但有可能这样做sizeof.

sizeof(matrix) = 24  // 2 * 3 ints (each int is sizeof 4)
sizeof(matrix[0]) = 12  // 3 ints
sizeof(matrix[0][0]) = 4  // 1 int
Run Code Online (Sandbox Code Playgroud)

所以,

int num_rows = sizeof(matrix) / sizeof(matrix[0]);
int num_cols = sizeof(matrix[0]) / sizeof(matrix[0][0]);
Run Code Online (Sandbox Code Playgroud)

或者定义自己的宏:

#define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))

int num_rows = ARRAYSIZE(matrix);
int num_cols = ARRAYSIZE(matrix[0]);
Run Code Online (Sandbox Code Playgroud)

甚至:

#define NUM_ROWS(a) ARRAYSIZE(a)
int num_rows = NUM_ROWS(matrix);
#define NUM_COLS(a) ARRAYSIZE(a[0])
int num_cols = NUM_COLS(matrix);
Run Code Online (Sandbox Code Playgroud)

但是,请注意,您无法传递此int[][]矩阵,然后使用宏技巧.不幸的是,与更高级别的语言(java,python)不同,这些额外的信息不会与数组一起传递(你需要一个结构或c ++中的类).的matrix变量仅指向的内存块,其中基质住.


AnT*_*AnT 5

它不可能是"像这样的东西".涉及两个(或更多)连续空方括号的语法[][]在C语言中永远不会有效.

当您使用初始化程序声明数组时,只能省略第一个大小.必须明确显示所有剩余尺寸.所以在你的情况下,第二个大小可以是3

int matrix[][3] = { { 2, 3, 4 }, { 1, 5, 3 } };
Run Code Online (Sandbox Code Playgroud)

如果你打算成为3.如果你愿意,它可以是5

int matrix[][5] = { { 2, 3, 4 }, { 1, 5, 3 } };
Run Code Online (Sandbox Code Playgroud)

换句话说,除了第一个,你将始终"知道"所有尺寸.没有办法绕过它.然而,如果你想在代码中的某个地方"回忆"它,你就可以获得它

sizeof *matrix / sizeof **matrix
Run Code Online (Sandbox Code Playgroud)

至于第一个尺寸,你可以得到它

sizeof matrix / sizeof *matrix
Run Code Online (Sandbox Code Playgroud)