Указатели на строки
Поскольку текстовая строка имеет тип const char [] и является массивом, к ней применимы все ранее приведённые соображения о массивах и указателях. Строковый литерал можно присвоить переменной типа char *. Это сделано для совместимости с ранними версиями языка C, в которых не было ключевого слова const. Однако изменение строкового литерала через такой указатель является ошибкой: void f() { char *p=”text”; p[3] = ‘a’; // ОШИБКА } Память под строковые литералы выделяется статически, поэтому их свободно можно возвращать в качестве значения функции: const char *access(int i) { … return “access denied”; }
Будут ли одинаковые литералы записываться в одно место памяти или нет – зависит от реализации.
Строки оканчиваются нуль-байтом (‘\0’), что делает их удобными для использования указателей. Рассмотрим копирование строк:
const char src[]=”Строка, которую надо скопировать”; char dst[sizeof src]; const char *p_src = src; char *p_dst = dst; while (*p_dst++ = *p_src++);
Создаются два указателя – константный указатель p_src, который хранит адрес копируемого элемента и указатель p_dst, хранящий адрес, куда будет скопирован элемент. Копирование будет продолжаться до тех пор, пока не будет скопирован нуль-байт, завершающий строку. Примечание. Цикл while (*p_dst++ = *p_src++); может быть записан в виде:
while (*p_src) // while (*p_src!=”\0”) { *p_dst = *p_src; p_dst++; p_src++; } *p_dst =”\0”;
|