В декларации, T D где D есть форма
* attribute-specifier-seqopt cv-qualifier-seqopt D1
и тип идентификатора в объявлении T D1 - «derived-declarator-type-list T», тогда тип идентификатора D - « указатель на »derived-declarator-type-list cv-qualifier-seqT . Применяется к указателю , а не объект указал. Точно так же необязательный элемент принадлежит указателю, а не указанному объекту.cv-qualifiersattribute-specifier-seq
const int ci = 10, *pc = &ci, *const cpc = pc, **ppc; int i, *p, *const cp = &i;
объявить ci, постоянное целое число; pc, указатель на постоянное целое число; cpc, постоянный указатель на постоянное целое число; ppc, указатель на указатель на постоянное целое число; i, целое число; p, указатель на целое число; и cpпостоянный указатель на целое число. Значение ci, cpcи cp не может быть изменено после инициализации. Значение pc может быть изменено, как и объект, на который указывает cp. Примеры некоторых правильных операций:
i = ci; *cp = ci; pc++; pc = cpc; pc = p; ppc = &pc;
Примеры плохо сформированных операций:
ci = 1; // error ci++; // error *pc = 2; // error cp = &ci; // error cpc++; // error p = pc; // error ppc = &p; // error
Каждый из них неприемлем, потому что он либо изменит значение объявленного объекта, const либо позволит позже изменить его с помощью указателя cv-unqualified, например:
*ppc = &ci; // OK, but would make p point to ci because of previous error *p = 5; // clobber ci
— end example ]
[ Note: Формирование указателя на ссылочный тип неверно; см [dcl.ref]. Формирование типа указателя функции неверно, если тип функции имеет cv-qualifiers или ref-qualifier; см [dcl.fct]. Поскольку адрес a bit-field не может быть взят, указатель никогда не может указывать на битовое поле. ] — end note