Если сам указатель volatile, то, естественно, с точки зрения компилятора "изменчив" будет только он, а не то, куда он показывает.
u32 volatile *p = (какой-то адрес); // указатель на volatile: например, периферийный регистр
u32 *volatile p = (какой-то адрес); // вот этот вот "какой-то адрес" нельзя оптимизировать; например, ISR "двигает" позиции программного FIFO