Покажчик форми
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;
Це говорить про те, що і вказівник, і вказівник можуть несподівано змінитися. Компілятор не може оптимізувати сам вказівник і не може оптимізувати те, на що вказують.
Сподіваюся, це допомагає!