Многомерный массив - это элементы массива, которые в свою очередь являются массивами.
Давайте рассмотрим ваше объявление
char names[2][5] = {"john","boy"};
Вы можете ввести псевдоним типа, например
typedef char T[5];
поэтому имя T
является псевдонимом для типа char[5]
.
Теперь ваше первоначальное объявление может быть переписано как
T names[2] = {"john","boy"};
То есть у вас есть массив из двух элементов который в свою очередь является массивом типа char [5].
Строковые литералы также имеют типы символьных массивов. Например, строковый литерал "John" может быть представлен как
char john[5] = { 'J', 'o', 'h', 'n', '\0' };
элементы строкового литерала используются для инициализации соответствующего массива символов.
Таким образом, ваш массив инициализируется как
char names[2][5] = { { 'J', 'o', 'h', 'n', '\0' }, { 'b', 'o', 'y', '\0', '\0' } };
Если строковый литерал содержит меньше элементов, чем количество элементов инициализированного массива, то все остальные элементы массива, не имеющие явного инициализатора, будут инициализироваться нулями.