Концепция объясняется здесь: С массивами, почему так получается, что [5] == 5 [a]? .Это альтернативный синтаксис, допускаемый «случайно» для сохранения согласованности языка, и ничего более.
Это не имеет ничего общего с типом контейнера, вы можете делать такие же неясные трюки с указателем на указатель, как с многомерными массивами.Пример:
#include <stdio.h>
int main (void)
{
char str[2][2][6] =
{
{"hello", "world"},
{"foo", "bar"}
};
printf("%c\n", str[0][0][0]); // print h
printf("%c\n", 0[0[0[str]]]); // print h (bad code, don't do this)
}
Причина, по которой вы можете делать такие вещи, как ptr[1*8+4*1+2]
, - это другая история, а именно то, что многомерный массив гарантированно размещается непрерывно.Это указано в C17 6.2.5 / 20:
Тип массива описывает непрерывно распределенный непустой набор объектов с конкретным типом объекта-члена, называемым элементом type .
Что касается «мнимых указателей», то, как получить доступ к массиву в машинном коде, зависит от компилятора.Иногда эффективнее использовать прямые адреса, иногда он использует базовый адрес + смещение.Это тот тип автоматической оптимизации, о котором программистам не нужно беспокоиться.