Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Строковые литералы



Литеральные строки вводятся непосредственно в текст программы. В объявлениях символических констант символьные строки должны быть заключены в кавычки:

#define TITLE "My program"

Константа TITLE ассоциируется с литеральной строкой "My program", которая запоминается в сегменте глобальных данных программы. Всего эта строка будет занимать 11 байт, включая как невидимый завершаю­щий нулевой байт, добавляемый после символа 'm', так и пробел между двумя словами. Пробел является значащим символом так же, как и символ табуляции.

В выражениях компилятор обращается с литеральной строкой, подобной "My program", как с адресом первого символа строки. Поэтому следующий оператор будет корректным:

char *stringPtr = "My program";

Переменная stringPtr объявляется как указатель на значение char. Данное присваивание инициализирует указатель stringPtr адресом символа 'М', который является первым символом литеральной строки "Мy program". Этот оператор, несмотря на свой внешний вид, не копирует символы из одной области памяти в другую. Символы запоминаются по фиксированному адресу, который присваивается указателю stringPtr.

Для ввода длинных литеральных строк введите один символ обратной косой черты, чтобы сообщить компилятору о продол­жении на следующей строке. Например, чтобы присвоить длин­ную строку указателю р, вы можете написать:

char *p = "Эту длинную строку я \

ввел на нескольких строчках, \

которые заканчиваются символами обратной косой черты.";

Результатом этого оператора будет одна строка, состоящая из символов между кавычками. Отступы во второй и третьей строчках не делаются, а если бы они были сделаны, то пробелы этих отступов были бы также внесены в строку.

Поскольку массивы и указатели эквивалентны (внутренне массив представляется как адрес первого эле­мента массива), то следующее выражение будет также приемлемым для компилятора:

char stringVar[] = "My program";

Эта запись объявляет переменную stringVar как массив значений типа char и является точным эквивален­том предыдущего объявления указателя stringPtr. Внутренне stringVar является указателем на тип char, кото­рый адресует строку. Но в этом случае литеральные символы из строки "My program" копируются в другую область памяти, зарезервированную для массива stringVar. Вы можете использовать эту форму объявления, если собираетесь с помощью программных операторов модифицировать эту строку. Используйте объявление

char *stringPtr = "My program";

для прямой адресации литеральной строки без копирования символов. Чтобы уберечь эту литеральную строку от изменений со стороны программных операторов, добавьте в объявление ключевое слово const:

const char *stringPtr = "My program"

Замечание

Не слишком разумно модифицировать литеральные строки, но все-таки это возможно при использовании ука­зателей-псевдонимов, даже когда строки объявлены со словом const. Но и в атом случае попытка изменить ли­теральные строки может закончиться провалом, если для их хранения использованы микросхемы ПЗУ или защищенная память.

Для объявления строковых указателей вы можете использовать любую запись (char s[] или char *s). Что­бы объявить строку заданного размера, необходимо использовать квадратные скобки. Например, строка

char bigString[80] = "My program";

резервирует 80-символьный массив, в который заносится литеральная строка "My program". Поскольку длина строки определена, последующие операторы могут запоминать до 79 символов в области памяти, адресуемой переменной bigString. Никогда не забывайте зарезервировать один дополнительный символ для завершающего нуля (представленного в программах как макроопределение NULL). Объявление char mystring[80]; резерви­рует память для 79 символов и нулевого символа. Чтобы запомнить 80-символьную строку в mystring, объяви­те ее как char mystring[81];

Будьте осторожны при использовании оператора присваивания применительно к строкам. Результаты мо­гут быть неожиданными. При сделанном объявлении

char *stringPtr = "Литеральная строка";

какой-нибудь оператор может позже переприсвоить указателю stringPtr адрес другой литеральной строки:

stringPtr = "Новая литеральная строка";

Но несмотря на эквивалентность массивов и указателей, то же самое невозможно со строковыми массива­ми. Если вы объявляете строку следующим образом:

char stringVar[] = "Литеральная строка";

позже вы не сможете присвоить другую строку оператором

stringVar = "Новая литеральная строка"; /*??? */

Этот оператор не будет скомпилирован, поскольку оператор присваивания не определен для строковых переменных. Хотя переменная stringVar внутренне представлена как указатель, она адресует память, зарезервированную для символов строки, и оператор присваивания не может копировать новые символы в эту память. Такое присваивание разрешается только с объявлении символьных массивов. Позже в этой главе вы узнаете, как можно копировать строки с помощью такой функции, как strcpy().





Дата публикования: 2015-01-23; Прочитано: 159 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...