Что означает "int * const const * b"? - PullRequest
3 голосов
/ 24 февраля 2012

int * const const * b

Что это значит? cdecl говорит declare b as pointer to const const pointer to int. Кто-нибудь может это объяснить?

Ответы [ 5 ]

2 голосов
/ 24 февраля 2012

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

Итак, это:

int * const * b;

становится:

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

Следовательно, в английском языке: указатель на постоянный указатель на int.

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

2 голосов
/ 24 февраля 2012

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

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

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

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

Даже cdecl.org говорит, что b is pointer to const const pointer to int.

2 голосов
/ 24 февраля 2012

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;
}
0 голосов
/ 24 февраля 2012

Это в основном int ** или указатель на указатель на int или указатель на массив int (где int * - это способ ссылки на int[]

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

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

0 голосов
/ 24 февраля 2012

Это то же самое, что и:

int * const * b;

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

const const допустимо в C99 / C11 и совпадает с const:

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

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

(C90, 6.5.3) «Один и тот же классификатор типов не должен появляться более одного раза в одном и том же списке спецификаторов или в списке спецификаторов, либо напрямую, либо через одну или несколько функций типа.»

...