Так как в этом, похоже, все запутано:
В старые времена у нас были 16-битные процессоры 8088, 268 и c. Чтобы сформулировать адрес, вам нужно было загрузить свой сегментный регистр (16-битный регистр) и адресный регистр. при доступе к массиву вы можете загрузить базу массива в регистр сегмента, а регистр адреса будет индексом. C компиляторы для этих платформ существовали, но арифметика указателей c включала проверку адреса на предмет переполнений и, в случае необходимости, изменение регистра сегментов (неэффективно). Указатели с плоской адресацией просто не были возможны в аппаратном обеспечении.
Перемотка вперед до 80386 Теперь у нас есть полное 32-битное пространство. Возможны аппаратные указатели. Индекс + базовая адресация влечет за собой штраф за 1 такт. Сегменты также 32-битные, поэтому массивы можно загружать с использованием сегментов, избегая этого штрафа, даже если вы работаете в 32-битном режиме. Кроме того, 368 увеличивает количество регистров сегмента на 2. (Понятия не имею, почему Intel посчитала это хорошей идеей). Тем не менее, все еще было много 16-битного кода
В наши дни регистры сегментов отключены в 64-битных В режиме Base + Index адресация свободна.
Существует ли платформа, в которой плоский указатель может превзойти аппаратную адресацию массива? Ну да. Motorola 68000, выпущенный в 1979 году, имеет плоское 32-битное адресное пространство, без сегментов, а режим адресации Base + Index влечет за собой 8-тактный цикл за немедленную адресацию. Так что, если вы программируете станцию Sun начала 80-х, Apple Lisa et c. это может быть актуально.
Короче. Если вы хотите массив, используйте массив. Если вы хотите указатель, используйте указатель. Не пытайтесь использовать ваш компилятор. Свернутый код для преобразования массивов в указатели чрезвычайно маловероятен и может быть медленнее.