Работа со строками

В программе строки могут определяться следующим образом [14]:

1) как строковые константы;

2) как массивы символов;

3) через указатель на символьный тип;

4) как массивы строк.

Программист должен понимать, что строка — это массив символов, и под неё необходимо выделять участок оперативной памяти.


Строковая константа

Любая последовательность символов, заключенная в двойные кавычки, рассматривается как строковая константа. Последовательность символов будет размещена в оперативной памяти ЭВМ, включая нулевой байт. Под строку выделяются последовательно идущие ячейки оперативной памяти. Для кодировки одного символа достаточно одного байта.

Если необходимо включить в строку символ двойных кавычек, ему должен предшествовать символ обратной дробной черты:

"Повсюду стали слышны речи:п"

"У'Пора добраться до картечи!"п"

"И вот на поле грозной сечип"

"Ночная пала теньЛп" . Строковые константы размещаются в статической памяти. Сама последовательность символов в двойных кавычких трактуется как адрес строки. Это аналогично использованию имени массива, служащего указателем на расположение массива.

Массив символов

При определении массива символьных строк необходимо сообщить компилятору требуемый размер памяти.

char m[82];

Компилятор также может самостоятельно определить размер массива символов.

char т2[]="Горные вершины спят во тьме ночной.";

char тЗ[]={'Т','и','х','и','е',' ','д','о','л','и','н', 1 ы' , ' ' п ' , ' о ' л ' н ' , ' ы' , ' 'с'в'е 'ж','е','й',' ','м','г','л','о','й',''};

Как и для других массивов, ml и тЪ являются указателями на первые элементы массивов.

 

т2 = == &т2[0]
*т2 = »г'
*(т2 + 1)== 'О'
тЗ == = &т3[0]
*(тЗ + 2) == ' х'

Для создания строки можно использовать указатель.


char *m4 = "He пылит дорога, не дрожат листы...";

Это почти то же самое, что и

char т5[] = "Подожди немного, отдохнешь и ты."; .

В обоих случаях тА и тЪ являются указателями на строки, и размеры массивов определяются компилятором. Однако между тА и тЪ есть и некоторая разница.

Массив или указатель.Во втором случае объявление массива вызывает создание в памяти массива из 33 элементов (по одному на каждый символ плюс один на завершающий символ ''). Каждый элемент инициализируется соответствующим символом. В дальнейшем компилятор будет рассматривать имя тЪ как синоним адреса первого элемента массива, т. е. &/и5[0]. Следует отметить, что тЪ является константой-указателем. Нельзя изменить т5, так как это означало бы изменение положения (адреса) массива в памяти. Можно использовать операции, подобные тЪ + 1, для идентификации следующего элемента массива, однако не разрешается выражение ++т5. Оператор увеличения можно использовать с именами переменных, но не констант [14].

В случае с указателем тА в памяти создается 36 элементов для запоминания строки. Но, кроме того, выделяется еще одна ячейка памяти для переменной тА, являющейся указателем. Сначала эта переменная указывает на начало строки, но её значение может изменяться. Поэтому допустимо использовать операцию приращения на единицу: ++тА будет указывать на второй символ строки — 'е' [14].

Различия между массивами и указателями.Рассмотрим различия в использовании описаний следующих двух видов [14]:

char heart[] = "Подожди немного,"; и char * reason = "отдохнешь и ты."; .

Основное отличие состоит в том, что указатель heart является константой, в то время как указатель reason — переменной. Посмотрим, что на самом деле дает эта разница.

Во-первых, и в том и в другом случае можно использовать операцию сложения с указателем.

 

for (i = 0; i < 17; i++ )  
putch ar ( -k (heart + i) ) r
putchar( 1 n )          
for (i = 0; i < 15; ■ + + )  
putch ar ( -k (reason + i ) ) ;
putchar( 1 n ) r