#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 - константный указатель на константный указатель на константное целое.
Комментариев нет:
Отправить комментарий