int * const const * b
Что означает «int * const const * b»?
Что это значит? cdecl говорит declare b as pointer to const const pointer to int
. Может кто-нибудь объяснить это?
int * const const * b
Что означает «int * const const * b»?
Что это значит? cdecl говорит declare b as pointer to const const pointer to int
. Может кто-нибудь объяснить это?
const const
является избыточным, оно уменьшится до const
.
Так давайте перепишем, что:
int * const *b;
Так b
указатель на константный указатель на междунар. С примером:
int main(int argc, char **argv) {
int i = 5;
int *ip = &i;
int * const const * b = &ip;
(**b)++; /* legal */
(*b)++; /* illegal */
(b)++; /* legal */
return 0;
}
Также см that question, это справедливо C99, но не действует C++ и не действует C89.
Это всего лишь указатель на константный указатель на целое число. Констант применяется к тому, что находится слева от него, если нет ничего слева от него: тогда оно применяется справа.
Здесь у вас есть избыточный redundancy, который повторяется так, что вы действительно уверены, что он const и не будет мутировать.
Здесь у вас есть избыточный redundancy, который повторяется так, что вы действительно уверены, что он const и не будет мутировать.
Даже cdecl.org сообщает, что b is pointer to const const pointer to int
.
Это то же самое, как:
int * const * b;
, который является указателем на указатель на const
int
.
const const
является законным в C99/C11 и такой же, как const
:
(C99, 6.7.3p4) «Если же отборочные появляется более одного раза в одной и той же спецификатор-квалификационном-лист, либо напрямую или через один или несколько typedefs, поведение такое же, как если бы оно появилось только один раз ».
Но это нарушение ограничения в C89:
(C90, 6.5.3) «Тот же тип Классификатор не должен появляться более чем один раз в том же списке спецификатора или списка спецификатора, либо непосредственно или через один или несколько typedefs. "
Это в основном int **
или указатель на указатель на междунар или указатель на целочисленный массив (где int *
это способ привязки к int[]
const
, расположенный после int *
средств указатель не может быть изменен (хотя это может быть содержимое), что является противоположностью const int *
.
Второй const
является надменным и игнорируется.
Общее решение для путаных деклараций: прочесть его назад. Хотя в этом случае вы должны сначала удалить избыточное const
.
Так что:
int * const * b;
становится:
b // b is a
* // pointer to
const // a constant
* // pointer to
int // an int
В английском языке, поэтому: указатель на константный указатель на Int.
Как уже упоминалось, это версия int **
.