Доступ к памяти через указатели считается более эффективным, чем доступ к памяти через массив. Я изучаю C, и выше указано в K & R. В частности, они говорят
Любая операция, которая может быть достигнута посредством подписи текста массива, также может быть выполнена с помощью указателей. Версия указателя в общем случае будет быстрее
Я снял следующий код с использованием Visual С++. (Mine - это процессор 686. Я отключил все оптимизации.)
int a[10], *p = a, temp;
void foo()
{
    temp = a[0];
    temp = *p;
}
К моему удивлению, я вижу, что доступ к памяти через указатель занимает 3 команды для двух, полученных путем доступа к памяти через массив. Ниже приведен соответствующий код.
; 5    : temp = a[0];
    mov eax, DWORD PTR _a
    mov DWORD PTR _temp, eax
; 6    : temp = *p;
    mov eax, DWORD PTR _p
    mov ecx, DWORD PTR [eax]
    mov DWORD PTR _temp, ecx
Пожалуйста, помогите мне понять. Что мне здесь не хватает?
Как указывалось многими ответами и комментариями, я использовал константу времени компиляции, как индекс массива, что делает его, возможно, более легким для доступа через массив. Ниже приведен код сборки с переменной в качестве индекса. Теперь у меня есть равное количество инструкций для доступа через указатель и массивы. Мои более широкие вопросы по-прежнему сохраняются. Доступ к памяти через указатель не обеспечивает себя более эффективным.
; 7    :        temp = a[i];
    mov eax, DWORD PTR _i
    mov ecx, DWORD PTR _a[eax*4]
    mov DWORD PTR _temp, ecx
; 8    : 
; 9    :    
; 10   :        temp = *p;
    mov eax, DWORD PTR _p
    mov ecx, DWORD PTR [eax]
    mov DWORD PTR _temp, ecx