Как объявить и инициализировать многомерный массив с помощью 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.