Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
http.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.34 Mб
Скачать

Указатели на константы

Модификатор const может использоваться для защиты объекта от возможного изменения со стороны функции. То есть, когда указатель передается в функцию, функция может модифицировать оригинал переменной, на которую указывает указатель. Если указатель определен как const, то функция не сможет модифицировать объект. Например, функция sp_to_dash() в следующей программе выводит дефис вместо каждого пробела в передаваемой строке. То есть строка «this is а test» будет напечатана как «this-is-a-test». Использование const при объявлении параметра гарантирует, что код функции не может модифицировать объект, на который указывает параметр. #include <stdio.h> void sp_to_dash(const char *str); int main(void) { sp_to_dash ("this is a test"); return 0; } void sp_to_dash (const char *str) { while(*str) { if(*str == ' ') printf ("%c", '-'); else printf("%c", *str); str++; } } Если написать sp_to_dash() таким образом, чтобы она модифицировала строку, то она не будет компилироваться. Например, если написать sp_to_dash() /* Это неверно */ void sp_to_dash (const char *str) { while(*str) { if(*str == ' ') *str = '-'; /* невозможно выполнить */ printf("%c", *str); str++; } } то возникнет ошибка времени компиляции.

Многие функции в стандартных библиотеках используют const при объявлении своих параметров. Это гарантирует сохранность объектов, на которые указывают параметры.

Указатели на константы

Модификатор const может использоваться для защиты объекта от возможного изменения со стороны функции. То есть, когда указатель передается в функцию, функция может модифицировать оригинал переменной, на которую указывает указатель. Если указатель определен как const, то функция не сможет модифицировать объект. Например, функция sp_to_dash() в следующей программе выводит дефис вместо каждого пробела в передаваемой строке. То есть строка «this is а test» будет напечатана как «this-is-a-test». Использование const при объявлении параметра гарантирует, что код функции не может модифицировать объект, на который указывает параметр. #include <stdio.h> void sp_to_dash(const char *str); int main(void) { sp_to_dash ("this is a test"); return 0; } void sp_to_dash (const char *str) { while(*str) { if(*str == ' ') printf ("%c", '-'); else printf("%c", *str); str++; } } Если написать sp_to_dash() таким образом, чтобы она модифицировала строку, то она не будет компилироваться. Например, если написать sp_to_dash() /* Это неверно */ void sp_to_dash (const char *str) { while(*str) { if(*str == ' ') *str = '-'; /* невозможно выполнить */ printf("%c", *str); str++; } } то возникнет ошибка времени компиляции.

Многие функции в стандартных библиотеках используют const при объявлении своих параметров. Это гарантирует сохранность объектов, на которые указывают параметры.

Указатели и массивы

Массивы и указатели тесно связаны между собой. Рассмотрим следующий фрагмент: char str [80], *p1; p1 = str; Здесь p1 устанавливается на первый элемент массива str. Если необходимо получить доступ к пятому элементу str, то следует написать str[4] или * (p1 +4) Оба оператора возвращают пятый элемент. Следует помнить, что индексация массивов начинается с нуля, поэтому для индексации str используется 4. К указателю p1 добавляется 4 для получения пятого элемента, поскольку p1 указывает на первый элемент str. (Надо помнить, что имя массива без индекса возвращает начальный адрес массива, то есть адрес первого элемента.)

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

Рассмотрим две упрощенные версии стандартной библиотечной функции puts() для демонстрации данных методов. Один вариант использует индексацию массива, а другой - указатели. Функция puts() выводит строку на стандартное устройство вывода: /* Использование массива */ int puts (const char *s) { register int t; for(t=0; s [t]; ++t) putchar (s [t]); return 1; } /* использование указателя */ int puts (const char *s) { while (*s) putchar (*s++); return 1; } Профессиональные программисты могут найти вторую версию более легкой для чтения и понимания, фактически, версия с указателями демонстрирует типичный способ написания подпрограмм в С.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]