Книга: Язык Си - руководство для начинающих

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

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

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

static char heart[ ] ="Я люблю Тилли !";

char *head ="Я люблю Милли!";

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

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

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

putchar(*(heart + i));

putchar('n');

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

putchar(*(head + i));

putchar('n');

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

Я люблю Я люблю

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

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

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

дают в результате:

Я люблю МИЛЛИ!

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

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

но теперь мы можем сказать

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

     Ситуация аналогична х = 3 или 3 = х; левая часть оператора присваивания должна быть именем переменной. В данном случае head = heart; не уничтожит строку Милли, а только изменит адрес, записанный в head. Вот каким путем можно изменить обращение к heart и проникнуть в сам массив:

heart[8] = 'М';

или

*(heart + 8) = 'М';

Элементы массива (но не имя) являются переменными

Оглавление книги


Генерация: 2.690. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз