Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Массивы символьных строк и их инициализация

Строковые константы

Строковая константа представляется последовательностью символов кода ASCII, заключённой в кавычки: "...". Она имеет тип char[].

Примеры:

"This is character string"

"Это строковая константа"

"A" "1234567890" "0" "$"

В конце каждой строки компилятор помещает нулевой символ '\0', отмечающий конец данной строки.

Каждая строковая константа, даже если она идентична другой строковой константе, сохраняется в отдельном месте памяти.

Если необходимо ввести в строку символ кавычек ("), то перед ним надо поставить символ обратной косой (\). В строку могут быть введены любые специальные символьные константы, перед которыми стоит символ \.

Символ \ и следующий за ним символ новой строки игнорируется.

Строковые константы размещаются в статической памяти. Вся фраза в кавычках является указателем на место в памяти, где записана строка. Это аналогично использованию имени массива, служащего указателем на расположение массива. Если это действительно так, то как выглядит оператор, который выводит строку?

/* Строки в качестве указателей */

main()

{

printf("%s, %u, %c\n", "We", "love", *"Pascal");

}

Итак, формат %s выводит строку We. Формат %u выводит целое без знака. Если слово "love" является указателем, то выдается его значение, являющееся адресом первого символа строки. Наконец, *"Pascal" должно выдать значение, на которое ссылается адрес, т.е. первый символ строки "Pascal".

Вот что выдаст наша программа:

We, 34, P

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

char m1[ ]="Только ограничьтесь одной строкой.";

инициализировал внешний по умолчанию массив m1 для указанной строки. Этот вид инициализации является краткой формой стандартной инициализации массива

char m1[ ]={

'T','o','л','ь','k','o','

','o','г'','p','a','н','и','ч','ь','т','e','c','ь','

',o','д','н','o','й','

','c','т','p','o','k','o','й','.','\0'

}

Без символа 0 мы имеем массив символов, а не строку. Для той и другой формы компилятор подсчитывает символы и таким образом получает размер памяти. Как и для других массивов, имя m1 является указателем на первый элемент массива:

m1 == &m1[0], *m1 == 'T', и *(m1+1) == m1[1] == 'o'

и т.д.

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

char *m3="\n Символьная строка.";

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

static char m3[ ]="\n Символьная строка.";

Оба описания говорят об одном: m3 является указателем строки со словами "Символьная строка". В том и другом случае сама строка определяет размер памяти, необходимой для ее размещения. Однако вид их не идентичен.

Массив и указатель: различия

В нижеследующем тексте мы обсудим различия в использовании описаний этих двух видов:

static char heart[ ] = "Я люблю язык Cи!";

char *head = "Я люблю язык Pascal!";

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

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

for(i=0;i<7;i++)

putchar(* (heart+i));

putchar('\n');

for(i=0;i<7;i++)

putchar(* (head+i));

putchar('\n');

В результате получаем

Я люблю

Я люблю

Но операцию увеличения можно использовать только с указателем:

while ((*head)!= '\0') /* останов в конце строки */

putchar(*(head++)); /* печать символа и перемещение указателя */

В результате получаем:

Я люблю язык Pascal!

Предположим, мы хотим изменить head на heart. Можно так:

head=heart; /* теперь head указывает на массив

heart */

но теперь можно и так

heart = head; /* запрещенная конструкция */

Ситуация аналогична x = 5 или 5 = x. Левая часть оператора присваивания должна быть именем переменной. В данном случае head = heart, не уничтожит строку про язык Cи, а только изменит адрес, записанный в head.

Вот каким путем можно изменить обращение к head и проникнуть в сам массив:

heart[13] = 'C';

или

*(heart+8)='C';

Переменными являются элементы массива, но не имя!

<== предыдущая лекция | следующая лекция ==>
Операции с указателями. Функции, массивы и указатели | Обработка строк
Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 382; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.