2012-02-24 3 views

ответ

2

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; 
} 
2

Также см that question, это справедливо C99, но не действует C++ и не действует C89.

Это всего лишь указатель на константный указатель на целое число. Констант применяется к тому, что находится слева от него, если нет ничего слева от него: тогда оно применяется справа.

Здесь у вас есть избыточный redundancy, который повторяется так, что вы действительно уверены, что он const и не будет мутировать.

Здесь у вас есть избыточный redundancy, который повторяется так, что вы действительно уверены, что он const и не будет мутировать.

Даже cdecl.org сообщает, что b is pointer to const const pointer to int.

0

Это то же самое, как:

int * const * b; 

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

const const является законным в C99/C11 и такой же, как const:

(C99, 6.7.3p4) «Если же отборочные появляется более одного раза в одной и той же спецификатор-квалификационном-лист, либо напрямую или через один или несколько typedefs, поведение такое же, как если бы оно появилось только один раз ».

Но это нарушение ограничения в C89:

(C90, 6.5.3) «Тот же тип Классификатор не должен появляться более чем один раз в том же списке спецификатора или списка спецификатора, либо непосредственно или через один или несколько typedefs. "

0

Это в основном int ** или указатель на указатель на междунар или указатель на целочисленный массив (где int * это способ привязки к int[]

const, расположенный после int * средств указатель не может быть изменен (хотя это может быть содержимое), что является противоположностью const int *.

Второй const является надменным и игнорируется.

2

Общее решение для путаных деклараций: прочесть его назад. Хотя в этом случае вы должны сначала удалить избыточное const.

Так что:

int * const * b; 

становится:

b  // b is a 
*  // pointer to 
const // a constant 
*  // pointer to 
int // an int 

В английском языке, поэтому: указатель на константный указатель на Int.

Как уже упоминалось, это версия int **.

Смежные вопросы