#include <stdio.h>

char buffer[4]="AAA";
//char buffer[4]={'A','A','A','A'};

void main()
{
    printf("0x%02X\n", *buffer);		// (1) не правильно!
    printf("0x%02X\n", (char *) *buffer);	// (2) правильно
}

Если массив buffer представляет собой char-элементы, то при обращении к нему,
как показано в строке (1), компилятор сгенерирует не тот код, что нам нужно.
При этом, никакой ошибки выдано не будет. Для того, чтобы компилятор сгенери-
ровал правильный код, к отдельному элементу char-массива нужно обращаться так,
как это сделано в строке (2), принудительно указав компилятору через cast-
операцию то, что нам нужно.
При обращении к массиву, состоящему из int-элементов, вышеописанных проблем
не возникает, компилятор генерирует правильный код.
Для более наглядного представления, о чем идет речь, можно просмотреть asm-
листинг, генерируемый компилятором для приведенного выше примера. Для строки
(1) компилятор не сгенерирует код "ld b,0".
