Страницы

Поиск по вопросам

четверг, 12 декабря 2019 г.

В чем смысл типа char * const* в языке Си?

#c #указатели #const


char* - указатель на переменную типа char.

char* const - константный указатель.

const char* - указатель на константную переменную.

const char* const - константный указатель на константу.

char const* - тоже самое, что и const char*. Автоматически в него преобразуется.

Но про char* const* компилятор gcc(c99) рассуждает, как об отдельном типе. Тоже самое
с const char* const*. В чем заключается смысл * после const вкупе с char*? Как описать
этот тип?
    


Ответы

Ответ 1



Это такой же указатель на указатель, как char**, только менять его адрес (того указателя, на который указывает переменная) нельзя. char* pc1 = (char*)malloc(LENGTH); strcpy(pc1, "Hello"); char* pc2 = (char*)malloc(LENGTH); strcpy(pc2, "World"); char* const* ppc1 = &pc1; // OK *ppc1 = pc2; // compile-time error char** ppc2 = &pc1; // OK *ppc2 = pc2; // OK

Ответ 2



Расшифровывать подобные обозначения (и более суровые, с участием указателей на функции, например) порой сильно помогает ресурс cdecl char* const* x declare x as pointer to const pointer to char x это указатель на константный указатель на char — ссылка x (char* const*) менять можно. *x (char* const) менять нельзя. **x (char) менять можно.

Ответ 3



Цитата из книги Бена Клеменса "Язык С в XXI веке" (Глава 8, Ключевое слово const): Объявления следует читать справа налево. Таким образом: int const - константное целое; int const * - (неконстантный) указатель на константное целое; int * const - константный указатель на (неконстантное) целое; int * const * - указатель на константный указатель на целое; int const * * - указатель на указатель на константное целое; int const * const * - указатель на константный указатель на константное целое. Как видите, квалификатор const всегда относится к тому, что находится слева от него, - как и *. Можно переставить местами имя типа и const, то есть int const и const int - одно и то же (хотя проделать этот фокус с const и * не удастся). Я предпочитаю форму int const, потому что она согласуется с более сложными конструкциями и прави­лом чтения справа налево. Но чаще встречается форма const int, быть может, по­тому что её проще произнести на обычном языке (константное целое) или потому что так "всегда делали". Так или иначе, годятся оба варианта. В статье на хабре Так вы думаете, что знаете Const? пошли ещё дальше и добавили третий квалификатор const: int const * const * const - константный указатель на константный указатель на константное целое.

Комментариев нет:

Отправить комментарий