Как получить размер массива

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

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

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

5
задан John Doe 27 May 2010 в 04:27
поделиться

4 ответа

Это довольно ограниченное использование, но это возможно с помощью 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 просто указывает на блок памяти, в котором находится матрица.

10
ответ дан 18 December 2019 в 11:54
поделиться

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

0
ответ дан 18 December 2019 в 11:54
поделиться

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

#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
ответ дан 18 December 2019 в 11:54
поделиться

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

Когда вы объявляете массив с инициализатором, только первый размер может быть опущен. Все остальные размеры должны присутствовать в явном виде. Поэтому в вашем случае второй размер может быть 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
5
ответ дан 18 December 2019 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: