Как получить размер массива - PullRequest
5 голосов
/ 27 мая 2010

Я хотел бы знать, как получить размер строк и столбцов массива. Например, это будет что-то вроде этого:

int matrix[][] = { { 2, 3 , 4}, { 1, 5, 3 } }

Размер этого будет 2 x 3. Как я могу рассчитать это, не включая другие библиотеки, кроме stdio или stdlib?

Ответы [ 4 ]

10 голосов
/ 27 мая 2010

Это довольно ограниченное использование, но это возможно сделать с 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

Итак,

int num_rows = sizeof(matrix) / sizeof(matrix[0]);
int num_cols = sizeof(matrix[0]) / sizeof(matrix[0][0]);

Или определите свой собственный макрос:

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

int num_rows = ARRAYSIZE(matrix);
int num_cols = ARRAYSIZE(matrix[0]);

Или даже:

#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);

Но учтите, что вы не можете обойти эту матрицу int[][], а затем используйте макрос трюк. К сожалению, в отличие от языков более высокого уровня (java, python), эта дополнительная информация не передается вместе с массивом (вам потребуется структура или класс в c ++). Переменная matrix просто указывает на блок памяти, в котором находится матрица.

5 голосов
/ 27 мая 2010

Это не может быть "что-то подобное". Синтаксис, включающий две (или более) последовательных пустых квадратных скобки [][], никогда не действует на языке Си.

Когда вы объявляете массив с инициализатором, только первый размер может быть опущен. Все остальные размеры должны присутствовать явно. Так что в вашем случае второй размер может быть 3

int matrix[][3] = { { 2, 3, 4 }, { 1, 5, 3 } };

если вы предполагали, что это будет 3. Или это может быть 5, если вы желаете

int matrix[][5] = { { 2, 3, 4 }, { 1, 5, 3 } };

Другими словами, вы всегда будете «знать» все размеры, кроме первого. Там нет никакого способа обойти это. Тем не менее, если вы хотите «вызвать» его где-то вниз по коду, вы можете получить его как

sizeof *matrix / sizeof **matrix

Что касается первого размера, вы можете получить его как

sizeof matrix / sizeof *matrix
0 голосов
/ 27 мая 2010

Пример для размера:

#include <stdio.h>
#include <conio.h>
int array[6]= { 1, 2, 3, 4, 5, 6 };
void main() {
  clrscr();
  int len=sizeof(array)/sizeof(int);
  printf("Length Of Array=%d", len);
  getch();
}
0 голосов
/ 27 мая 2010

sizeof (matrix) даст вам общий размер массива в байтах. sizeof (matrix[0]) / sizeof (matrix[0][0]) дает вам размер внутреннего массива, а sizeof (matrix) / sizeof (matrix[0]) должен быть внешним размером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...