Как объявить и инициализировать многомерный массив с помощью NULL

#include <stdio.h>
int main() { const char *number_groups[2][4][2] = { { {"5", "6"}, {"5.0", "6.0"}, {"5/1", "6/1"}, {"15/3", "-12/-2"}, }, { // number_groups[1] {"-98765432109876543210", "98765432109876543210"}, {"-98765432109876543210.0", "98765432109876543210"}, {"-98765432109876543210/1", "98765432109876543210/1"}, NULL // number_groups[1][3] } }; printf("(number_groups[1][3] == NULL) == %d\n", number_groups[1][3] == NULL); return 0;
}
</stdio.h>

(проверьте код)

Я хочу создать многомерный массив, элементы которого являются парами для c-строк.

Если бы я делал всего лишь массив из 10 c-строк, я мог бы заполнить его двумя c-строками, а другие 8 указателей были бы NULL s, но если я хочу сделать более сложный массив, как то, что я разместил в верхней части этого пост, я не знаю, как это сделать. Ниже приведен пример различия между инициализацией массива из 10 c-строк и массивом из 10 массивов:

#include <stdio.h>
int main() { const char* array[10] = { "/usr/bin/ls", "-l" }; for (unsigned int i = 0; i < 10; ++i){ printf("(array[%d] == NULL) == %d\n", i, array[i] == NULL); } const char* array2[10][2] = { {"aa", "bb"}, {"bb", "cc"} }; for (unsigned int i = 0; i < 10; ++i){ printf("(array2[%d] == NULL) == %d\n", i, array2[i] == NULL); } return 0;
}
</stdio.h>

(проверьте код)

1 ответ

Макеты C-стиля немного запутаны и архаичны. Они являются лишь сокращением для отображения осей на блок данных.

В этом примере вы можете увидеть, что есть (по крайней мере) 4 способа доступа к одному и тому же элементу в массиве c-style:

#include <iostream>
using namespace std;
#define X_EXTENT 4
const char* array2[10][X_EXTENT];
int main()
{ int y = 5, x = 1; array2[y][x] = "hello"; cout << array2[y][x] << endl; cout << *(array2[y] + x) << endl; cout << *(*(array2 + y ) + x) << endl; cout << *(reinterpret_cast<const char**="">(array2) + y * X_EXTENT + x) << endl; return 0;
}
</const></iostream>

licensed under cc by-sa 3.0 with attribution.