"Беги, Cпот, беги! - "сказал Дик.
Cтроковые константы размещаются в статической памяти. Вся фраза в кавычках является указателем на место в памяти, где записана строка. Это аналогично использованию имени массива, служащего указателем на расположение массива. Если это действительно так, то как выглядит оператор, который выводит строку?
/* строки в качестве указателей */
main( )
{
printf("%s, %u, %c n", "We", "love", *"figs");
Итак, формат %s выводит строку We. Формат %u выводит целое без знака. Если слово "love" является указателем, то выдается его значение, являющееся адресом первого символа строки. Наконец, *"figs" должно выдать значение, на которое ссылается адрес, т. е. первый символ строки "figs". Произойдет ли это на самом деле? Да, мы получим следующий текст:
We, 34, f
Ну, вот! Давайте теперь вернемся к строкам, находящимся в символьных массивах.
Массивы символьных строк и их инициализация
При определении массива символьных строк необходимо сообщить компилятору требуемый размер памяти. Один из способов сделать это - инициализировать массив при помощи строковой константы. Так как автоматические массивы нельзя инициализировать, необходимо для этого использовать статические или внешние массивы. Например, оператор
char m1[ ] = "Только ограничьтесь одной строкой.";
инициализировал внешний (по умолчанию) массив m1 для указанной строки. Этот вид инициализации является краткой формой стандартной инициализации массива
char m1[ ] = {'Т', 'о', 'л', 'ь', 'к', 'о', ' ',
'о', 'г', 'р', 'а', 'н', 'и', 'ч',
'ь', 'т', 'e', 'с', 'ь', ' ', 'о',
'д', 'н', 'о', 'й', ' ', 'с', 'т',
'р' 'о', 'к', 'о', 'й', ' .', ' '};
(Обратите внимание на замыкающий нуль-символ. Без него мы имеем массив символов, а не строку.) Для той и другой формы (а мы рекомендуем первую) компилятор подсчитывает символы и таким образом получает размер массива.
Как и для других массивов, имя m1 является указателем на первый элемент массива:
m1 == &m1[0], *m1 == 'Т', и *(m1 + l) == m1[1] == 'о',
Действительно, мы можем использовать указатель для создания строки. Например:
char *m3 = " n Достаточно обо мне - как вас зовут?";
Это почти то же самое, что и
static char m3[ ] = "n Достаточно обо мне - как вас зовут?" ;
Оба описания говорят об одном: m3 является указателем строки со словами " Как вас зовут?" . В том и другом случае сама строка определяет размер памяти, необходимой для ее размещения. Однако вид их не идентичен.
Массив или указатель
В чем же тогда разница между этими двумя описаниями? Описание с массивом вызывает создание в статической памяти массива из 38 элементов (по одному на каждый символ плюс один на завершающий символ '