В нижеследующем тексте мы обсудим различия в использовании описаний этих двух видов:
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';
Переменными являются элементы массива, но не имя!