Язык программирования C

Скачать в pdf «Язык программирования C»


Строковые константы не обязаны быть только аргументами функций. Пусть переменная ртеssage объявлена следующим образом: char *pmessage;


Тогда следующий оператор присваивает ей указатель на массив символов: pmessage = «now is the time»


При этом не выполняется копирование строки. В языке С нет операций для манипулирования именно строкой символов как единым целым; вместо этого применяются операции с указателями.


Между следующими двумя определениями есть важное различие:


char amessaget] = «now is the time»; /* массив */ char *pmessage = «now is the time»; /* указатель */


В первом из них amessage — это массив, ровно такой длины, чтобы в него поместилась инициализирующая строка символов и завершающий ‘ 0 ‘. Отдельные символы в строке можно изменять, но переменная amessage всегда будет указывать на один и тот же участок памяти. А вот pmessage — это указатель, который после инициализации указывает на строковую константу; впоследствии этот указатель можно изменить так, чтобы он указывал в другое место, но попытка изменить содержимое строки после этого даст неопределенный результат.


pmessage


amessage


Проиллюстрируем дополнительные аспекты указателей и массивов на примере двух полезных функций, адаптированных из стандартной библиотеки. Первая из них— это strcpy(s, t), которая копирует строку t в строку s. Было бы неплохо иметь возможность просто написать s=t, но при этом скопируется только указатель, а не символы. Чтобы скопировать сами символы, нужен цикл. Вначале рассмотрим версию с массивом:


/* strcpy:    копирует строку t в s; версия с индексированием массива


*/


void strcpy(char *s, char *t)

{


int i;


i = 0;


while ( (s [i] = t [i])    != ‘ 0 ‘ )

Скачать в pdf «Язык программирования C»