2016-06-30 12 views
1

У меня небольшая проблема с синтаксисом Си. Я знаю, что писатьvolatile указатель на volatile char. дополнительное статическое ключевое слово

volatile char * volatile foo; 

создает энергонезависимую переменную указатель на летучем полукокса.

В моем понимании первое летучее означает, что указатель указывает на летучий элемент из-за части «изменчивый символ». Вторая изменчивость означает, что указатель «foo» сам по себе нестабилен.

Правильно ли это предположение?

Что

static volatile char * volatile bar; 

делать?

Предполагается, что приведенный выше оператор верен, он должен объявить volatile указатель на volatile + static char. Моя проблема заключается в том, что для указателя не обязательно знать, является ли целевая переменная статической или нет. Таким образом, это, вероятно, объявляет статический + volatile указатель на volatile char.

Однако предполагается, что это правильно, первый volatile будет ссылаться на указатель, а второй - на указанные данные.

Какое правильное предположение? Что делает каждый volatile?

Благодаря

ответ

2

В моем понимании первое летучее означает, что указатель указывает на летучий элемент из-за части «изменчивого символа». Вторая изменчивость означает, что указатель «foo» сам по себе является неустойчивым. Правильно ли это предположение?

Да. Каждый тип классификатора (и/или const и/или restrict) в левой части * относится к типу заостренного типа, в то время как квалификатор каждого типа в правой части относится к самому типу указателя. Это справедливо только для классификаторов типов.

static (а также внешний, авто и т. Д.) Являются спецификаторами класса хранения, которые касаются только переменной продолжительности и объема. Они всегда ссылаются на объявленный тип переменной, в этом случае указатель.Было бы бессмысленно объявлять спецификатор класса хранения для заостренных данных, поскольку эти данные не объявлены в этой строке, а в какой-то другой строке.

Также обратите внимание, что вы всегда можете объявить переменную указателя с большим количеством классификаторов типов, чем у указанного указателя, но никогда с меньшим количеством. Это важно знать при реализации const correctness.

+0

Спасибо. Помог мне много: D – GNA

0

Так что это, вероятно, объявляет статический + летучий указатель на летучем полукокса

Большинство, конечно, да.

Тем не менее, предполагается, что это правильно первое летучим будет ссылка на указатель, а вторая к данным указали на

NOPE. static просто означает, что bar является статическим. Это не имеет ничего общего с изменчивым. Так, например, static char * volatile bar является изменчивым статическим указателем, а static volatile char *bar - статическим указателем на изменчивый символ.