Программирование ARM Определения "char const *" и "const char *" - в чем разница? Tue, October 15 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Определения "char const *" и "const char *" - в чем разница? Печать
Добавил(а) microsin   

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

const-char-bart

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

char const * УказательНаНЕизменяемоеСодержимое1;
const char * УказательНаНЕизменяемоеСодержимое2;

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

Примечание: в какой реально памяти находится константа - зависит от платформы, для которой компилируется код. Например, для процессоров ARM встраиваемых систем константа может находиться в памяти программ FLASH, а для процессоров PC константы, как и обычные переменные, хранятся в памяти RAM.

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

char * const НЕизменяемыйУказательНаИзменяемоеСодержимое;

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

char const * const НЕизменяемыйУказательНаНЕизменяемоеСодержимое;

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

Ключевое слово const используется, когда мы хотим сделать что-то - наподобие переменной - доступным только для чтения. При этом это что-то совсем не обязательно может храниться в памяти ROM, данные объекта "только для чтения" могут храниться и в RAM (зависит от используемой платформы, для которой компилируется код). Ниже приведено несколько примеров использования ключевого слова const.

const int j = 10;

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

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

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

// Создание указателя на константу:
const char* pntr = "не изменяемые данные";
 
// Это тоже создает указатель на константу. Хотя здесь синтаксис
// отличается от приведенного выше, это в сущности одно и то же.
char const* pntr = "не изменяемые данные";
 
// Этот код приведет к ошибке, потому что данные не могут быть
// изменены.
*pntr = "проверка";
 
// Но этот код считается безошибочным, потому что адрес указателя
// можно поменять (сам указатель не константа).
pntr = "проверка";

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

// Это определение const-указателя, хранящийся в нем
// адрес поменять нельзя, но сами данные поменять можно.
char* const pntr = "какие-то данные";
 
// Этот код корректен и допустим, потому что данные менять можно:
*pntr = "проверка";
 
// Но этот код приведет к ошибке, потому что адрес
// постоянного указателя поменять нельзя:
pntr = "проверка";

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

// Это const-указатель на константу.
const char* const pntr = "Это поменять нельзя";

[Ссылки]

1. const char* and char const* - are they the same? site:stackoverflow.com.
2. Барт Симпсон Генератор картинок онлайн site:advice-dog.ru.
3. Использование описателя const в C.
4. Как читать сложные декларации C/C++.

 

Комментарии  

 
+6 #1 Ruslan 22.04.2020 19:03
Но позвольте, вы же говорите что const влияет только на содержимое слева от const, а сами используете const самым левым (т.е. не влияющим ни на что).

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

Добавить комментарий


Защитный код
Обновить

Top of Page