При определении массива символьных строк необходимо сообщить компилятору требуемый размер памяти. Один из способов сделать это - инициализировать массив при помощи строковой константы. Например, оператор
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+13)='C';Переменными являются элементы массива, но не имя!