Покажчик форми
volatile int* p;
є покажчиком на intте, що компілятор буде розглядати як volatile. Це означає, що компілятор припустить, що можлива pзміна змінної, на яку вказує, навіть якщо у вихідному коді нічого не передбачає, що це може статися. Наприклад, якщо я встановив pвказівку на звичайне ціле число, то кожного разу, коли я читаю або пишу *pкомпілятор, усвідомлюю, що значення могло несподівано змінитися.
Існує ще один варіант використання для volatile int*: Якщо ви оголосите intяк volatile, тоді вам не слід вказувати на нього звичайним int*. Наприклад, це погана ідея:
volatile int myVolatileInt;
int* ptr = &myVolatileInt;
Причиною цього є те, що компілятор C більше не пам'ятає, що змінна, на яку вказує, ptrє volatile, тому може *pнеправильно кешувати значення в регістрі. Насправді в C ++ вищевказаний код є помилкою. Натомість вам слід писати
volatile int myVolatileInt;
volatile int* ptr = &myVolatileInt;
Тепер компілятор пам’ятає, що ptrвказує на a volatile int, тому він не буде (або не повинен!) Намагатися оптимізувати доступ через *ptr.
Остання деталь - вказівник, який ви обговорили, є вказівником на a volatile int. Ви також можете зробити це:
int* volatile ptr;
Це говорить про те, що покажчик сам є volatile, що означає , що компілятор не повинен намагатися кешувати покажчик в пам'яті або спробувати оптимізувати значення покажчика , тому що сам покажчик може отримати перепризначений на що - то інше (апаратне забезпечення, і т.д.) Ви можете комбінувати ці разом, якщо ви хочете отримати цього звіра:
volatile int* volatile ptr;
Це говорить про те, що і вказівник, і вказівник можуть несподівано змінитися. Компілятор не може оптимізувати сам вказівник і не може оптимізувати те, на що вказують.
Сподіваюся, це допомагає!