что такое const char

Что такое const char

В действительности, в соответствии со стандартом на языки C и C++ (правило чтения операторов «Read Declarations Right-to-Left«, т. е. надо читать всегда оператор справа налево), модификатор const влияет на элемент, слева от которого стоит const. Поэтому если использовать const перед типом, то это фактически ничего не значит, и используется просто для удобства запоминания.

К примеру, следующие два оператора совершенно эквивалентны:

Оба указателя УказательНаНеизменяемоеСодержимое1 и УказательНаНеизменяемоеСодержимое2 указывают на строку, являющуюся константой, и оба эти указателя можно модифицировать runtime в коде программы.

Если же Вы хотели получить от указателя другое, чтобы это был постоянный указатель, который нельзя модифицировать, то нужно поместить const после звездочки (тогда получится наоборот, строка может быть изменяемой, а сам указатель изменить нельзя):

Чтобы защитить от изменения как сам указатель, так и содержимое, на которое он указывает, то нужно использовать два ключевых слова const:

[Примеры ключевого слова const при использовании с указателями]

В этом простом примере если мы попробуем в коде присвоить значение переменной j, то это будет обнаружено на этапе компиляции программы, компилятор выдаст ошибку.

Указатель на константу. Когда ключевое слово const используется с указателями, то важно помнить, что реальный смысл определения зависит от положения ключевого слова const.

Указатель на константу указывает на данные, которые должны быть постоянными. Это просто означает, что мы не можем поменять данные, на которые ссылается указатель. Вот несколько примеров кода, иллюстрирущие то, что мы подразумеваем указателем на константу:

Постоянный указатель. В таком указателе находящийся в нем адрес является константой. Но сама переменная, на которую ссылается указатель может быть изменена, т. е. она может не являться константой. Вот несколько примеров:

Постоянный указатель на константу. Можно думать об этом случае как о комбинации двух примеров выше. Т. е. нельзя поменять ни сам адрес (значение указателя), ни данные, на которые он указывает. Пример:

[Ссылки]

Комментарии

Но позвольте, вы же говорите что const влияет только на содержимое слева от const, а сами используете const самым левым (т.е. не влияющим ни на что).

/*const int j = 10;
В этом простом примере если мы попробуем в коде присвоить значение переменной j, то это будет обнаружено на этапе компиляции программы, компилятор выдаст ошибку.» */

Источник

C++ поддерживает две нотации неизменности:

Читайте также:  что такое антропология в философии

constexpr функция должна быть достаточно простой, чтобы вычисляться компилятором, а также возвращать вычисленное значение. constexpr функции могут вызываться неконстантыми аргументами в контексте которых не требуются константные выражения.

const

Объекты со спецификатором const не могут быть изменены, а также должны быть инициализированы.

Поскольку объекты со спецификаторов const не могут быть изменены, то следующий код будет ошибочным:

Обратите внимание, что const изменяет тип объекта, а не указание того, как должна быть назначена переменная. const ограничивает способы работы с объектом.

При использовании указателя задействуются два объекта: сам указатель и объект, на который указывает. Префиксное’ объявление указателя с const делает константным объект, а не указатель. Чтобы объявить как const сам указатель, а не объект, на который он указывает, необходимо поместить const после символа указателя. Например:

Местоположение const относительно базового типа не принципиально, поскольку не существует типа данных const*. Принципиальным является положение const относительно символа *. Поэтому возможны следующие записи:

Первая версия используется для строк, элементы которых не должны быть изменены функцией и возвращает указатель на const, который не позволяет изменять результат. Вторая версия используется для изменяемых строк.

Вы можете назначить адрес неконстантной переменной указателю на константу, потому что это не может нанести никакого вреда. Однако адрес константы нельзя назначить неконстантному указателю, поскольку это позволит изменить значение объекта. Например:

constexpr

Константное выражение является выражением, которое вычисляется во время компиляции. Константные выражения не могут использовать значения и переменные, которые не известны во время компиляции.

Существует множество причин, по которым кому-то может понадобиться именованная константа, а не буква или значение, хранящееся в переменной:

Значение constexpr вычисляется во время выполнения компиляции, и если оно не может быть вычислено, то компилятор выдаст ошибку.

Источник

char * и const char *

Решил вернуться к СИ и прочитать книгу K&R, и вот опять споткнулся на теме указателей, по логике вроде все понятно, но вот именно с char * и const char * какие-то проблемы.

Давайте я приведу код и покажу что мне все такие не ясно!

Пример 1:

Пример 2:

Пример 3:

Подведем черту над всеми этими примерами: Почему я не могу в первом примере поменять отдельно каждый литерал? (Я же не объявлял объект константным как во втором примере)

P.S Третий пример привел для общей картины чтобы показать что все работает если ввести дополнительный параметр

Читайте также:  что делать если место укуса клеща гноится

4 ответа 4

В первом и втором случае вы работаете напрямую со строковым литералом.

В конечном итоге возможность легальной модификации объекта определяется именно и только модифицируемостью самого объекта и никак не зависит от константности пути доступа к нему (ибо последняя легко устранима).

Учитывая, что литерал является неизменяемым объектом, указывать на строковые литералы неконстантным указателем (как в вашем первом примере) никакого смысла нет, даже если язык и позволяет формально это делать.

В третьем варианте вы не работаете со строковым литералом напрямую, а создаете собственный модифицируемый массив, который только инициализируется значением строкового литерала. Т.е. ваш массив содержит самостоятельную копию значения строкового литерала. Это ваш собственный массив и вы можете модифицировать его как угодно.

Источник

Разница между char* и const char*?

в чем разница между

что указывает на постоянный строковый литерал и

9 ответов

char* Это mutable указатель на mutable символ/строку.

const char* это mutable указатель на неизменяемые символ/строку. Вы не можете изменить содержимое местоположения, на которое указывает этот указатель. Кроме того, компиляторы должны выдавать сообщения об ошибках при попытке сделать это. По той же причине, преобразование из const char * to char* устарела.

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

const char* const это неизменяемые указатель на неизменяемые символ/строку.

вы можете изменить символ, который name указывает, а также символ, на который он указывает.

EDIT:

из комментариев ваш вопрос, похоже, спрашивает о разнице между двумя объявлениями, когда указатель указывает на строковый литерал.

в этом случае не должен изменить символ, к которому name баллов, так как это может привести к неопределено Поведение. Строковые литералы могут быть выделены в областях памяти только для чтения (реализация определена), и пользовательская программа не должна изменять его в любом случае. Любая попытка сделать это приводит к неопределенному поведению.

так что единственная разница в этом случае (использования со строковыми литералами) заключается в том, что второе объявление дает вам небольшое преимущество. Компиляторы обычно дают вам предупреждение, если вы попытаетесь изменить строковый литерал во втором случай.

выход:

cc1: предупреждения рассматриваются как ошибки
еда.c: в функции ‘ main’:
еда.c: 9: ошибка: передача аргумента 1 ‘strcpy’ отбрасывает квалификаторы из целевого типа указателя

обратите внимание, что компилятор предупреждает о втором случае, но не о первом.

Читайте также:  что значит солевой вейп

Источник

В чем разница между char * const и const char *?

Какая разница между:

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

который является постоянным указателем на постоянный символ (поэтому ничего нельзя изменить).

Следующие две формы эквивалентны:

Точная причина этого описана в стандарте C ++, но важно помнить и избегать путаницы. Я знаю несколько стандартов кодирования, которые предпочитают:

Чтобы избежать путаницы, всегда добавляйте const квалификатор.

const всегда изменяет то, что стоит перед ним (слева от него), ЗА ИСКЛЮЧЕНИЕМ, когда это первое в объявлении типа, где оно изменяет то, что следует за ним (справа от него).

Итак, эти два одинаковы:

определяет const указатель на целое число и инициализирует его, чтобы он указывал на ячейку памяти 12345678. Вы можете изменить int значение по адресу 12345678, но вы не можете изменить адрес, на который i3 указывает.

Смотрите также:

const char* является указателем на постоянный символ
char* const является постоянным указателем на символ
const char* const является постоянным указателем на постоянный символ

Правило большого пальца: прочитайте определение справа налево!

const int *foo;

Означает « foo указывает ( * ) на то, int что не может изменить ( const )».
Для программиста это означает: «Я не буду менять значение того, на что foo указывает».

int *const foo;

Означает » foo не может изменить ( const ) и указывает ( * ) на int «.
Для программиста это означает: «Я не буду менять адрес памяти, который foo относится к».

const int *const foo;

Означает « foo не может изменить ( const ) и указывает ( * ) на int что не может изменить ( const )».
Для программиста это означает: «Я не буду менять значение того, на что foo указывает, и я не буду менять адрес, который foo ссылается».

const char * x Здесь X в основном символьный указатель, который указывает на постоянное значение

char * const x относится к символьному указателю, который является постоянным, но местоположение, на которое он указывает, может быть изменено.

const char * const x является комбинацией 1 и 2, означает, что это постоянный символьный указатель, который указывает на постоянное значение.

const * char x вызовет ошибку компилятора. это не может быть объявлено.

символ const * x равен точке 1.

Источник

Строительный портал