Указатели только для чтения
С помощью параметра-указателя функция может менять переменные вызывающей стороны. Это удобно, но и рискованно: функция, которая должна только читать массив, может случайно его изменить. А тот, кто читает первую строку int sum(int *numbers, int count), не поймёт, меняет ли функция массив.
Ключевое слово const решает обе проблемы. Вы знаете его по константам вроде const double VAT = 0.21;: значение, которое нельзя менять. Перед типом указателя оно означает, что значения нельзя менять через этот указатель:
int sum(const int *numbers, int count) {
int total = 0;
for (int i = 0; i < count; i++) {
total += numbers[i];
}
return total;
}Читайте const int *numbers как «numbers указывает на целые числа, которые можно только читать». Массив, который вы передаёте, не обязан быть const: обещание действует только внутри функции. Если функция всё же попробует его изменить, например через numbers[0] = 0;, компиляция закончится ошибкой read-only variable is not assignable. Поэтому пишите const всякий раз, когда функция только читает массив. Тогда её первая строка так и говорит, а компилятор следит за выполнением.
Вы уже встречали это: параметр const char text[] из урока «Функции» — то же самое, что const char *text.
Со строками у const есть ещё одно применение. Указатель может указывать и на текст в кавычках:
#include <stdio.h>
int main(void) {
char word[] = "cat";
word[0] = 'h';
printf("%s\n", word);
const char *pet = "dog";
printf("%s\n", pet);
pet = "fish";
printf("%s\n", pet);
return 0;
}Программа выведет:
hat
dog
fishchar word[] = "cat"; создаёт массив и копирует в него текст. Массив ваш, поэтому его буквы можно менять. (Слова в этом примере записаны латиницей: русская буква занимает в C два байта, и отдельные буквы такого слова так просто не поменять.) const char *pet = "dog"; не создаёт собственного массива: указатель лишь указывает на текст в кавычках, а этот текст хранится в части памяти, которую программа не должна менять. Поэтому перед ним нужен const. Тогда pet[0] = 'f'; — ошибка компиляции (read-only variable is not assignable), зато указатель pet можно направить на другой текст: pet = "fish";. C позволяет написать и char *pet = "dog"; без const, но менять текст через такой указатель — баг: на компьютере программа обычно аварийно завершается.
Задание
- 1
Функция
count_passedтолько читает массив. Измените её параметр наconst int *scores. Программа по-прежнему выводитСдали: 3. - 2
Функция
print_titleтолько читает текст, а текст в кавычках всё равно нельзя менять. Измените её параметр наconst char *title. - 3
Ниже
count_passedнапишите функциюbest, которая получает баллы какconst int *scoresи их количество и возвращает наивысший балл. Вmainниже последнегоprintfвыведитеЛучший балл:и результатbest(scores, 5). Программа выведетЛучший балл: 90.