Как интерпретировать изменчивость, когда есть несколько уровней косвенности - PullRequest
0 голосов
/ 04 июня 2018

Предположим, у меня есть следующее

struct my_struct ** value;

Я понимаю разницу между

struct my_struct volatile * other_value; // pointer is volatile

и

struct * volatile other_value; // what pointer points to is volatile

, но в чем разница между

struct my_struct * volatile * value;  // call this (1)

и

struct my_struct ** volatile value;  // call this (2)

Правильно ли говорить, что (1) означает, что указатель, на который указывает значение, является изменчивым, а (2) означает, что значение является изменчивым, и указатель, на который оно указываети данные, на которые указывает указатель, не являются изменчивыми?Или у меня это задом наперед?

В более общем случае рассмотрим что-то, что может выглядеть следующим образом

struct my_struct ***** volatile *** value

, какой указатель в этой "серии" указателей является изменчивым указателем?Будет ли указатель перенаправлен (это правильная терминология?) 3 раза от значения или 4?Иными словами, всегда ли volatile работает с самым правильным значением / ptr / оператором (какая здесь будет правильная терминология?).

Например,

struct my_struct ******** volatile value

означает, что значение является изменчивым

struct my_struct ******* volatile * value

означает, что указатель, на который указывает значение указателя, является изменчивым

struct my_struct ****** volatile ** value

означает, что указатель, на который указывает указатель, на который указывает значение, является изменчивым.И так далее.Правильно ли мое понимание?

Редактировать: Я был полностью неправ.volatile применяется слева, а не справа.

1 Ответ

0 голосов
/ 04 июня 2018

Практическое правило заключается в том, что квалификатор (volatile или const и т. Д.) Придерживается того, что находится слева от него.

Я понимаю разницу между

struct my_struct volatile * other_value; // pointer is volatile

и

struct * volatile other_value; // what pointer points to is volatile
... Или у меня это задом наперед?

У вас это задом наперед.Первый случай делает данные структуры изменчивыми, второй случай делает сам указатель изменчивыми.

struct my_struct ***** volatile *** value

Это означает, что левый указатель * volatile является изменчивымквалифицированный.

В общем, чтение объявлений в C справа налево помогает:

  • other_value other_value ...
  • * other_value ...is указатель ...
  • struct my_struct volatile * other_value ... на struct my_struct volatile.

Также обратите внимание, что глупо, C допускает размещение спецификатора в объявлении переменнойв любом месте.Это означает, что volatile int* x; и int volatile* x; эквивалентны.Нет здравого смысла, почему это разрешено, просто так было всегда.

...