AVR C - Как ведет себя спецификатор const в объявлении таблицы поиска? - PullRequest
0 голосов
/ 02 мая 2018

Я нашел следующий код на форуме, и мне было интересно, как в нем ведет себя классификатор const?

const uint8_t data[] = { 15, 3, 41, 76, 2, 9, 5 };

val = data[5];

Теперь, насколько я понимаю, квалификатор const делает переменную data[] доступной только для чтения, так что в этом примере содержимое массива не может быть изменено. Что меня смущает, так это то, что спецификатор применяется к массиву, который является указателем, поэтому содержимое массива может быть изменено, но сам указатель не может.

Прав ли я? Или содержимое массива доступно только для чтения?

1 Ответ

0 голосов
/ 02 мая 2018

массив, который является указателем

Нет, нет , нет . Массивы являются , а не указателями. Указатель - это адрес (обычно 4 или 8 байт в современных настольных системах). Массив - это последовательность смежных объектов в памяти, одна за другой.

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

Учитывая вышесказанное, ответ ясен: data - это массив из 7 объектов типа const uint8_t, что означает, что его содержимое не может быть изменено. В выражениях data будет неявно преобразовываться в тип const uint8_t * (указатель на 8-разрядное целое число без знака).

...