Книга: Язык Си - руководство для начинающих
Массив и указатель: различия
Массив и указатель: различия
В нижеследующем тексте мы обсудим различия в использовании описаний этих двух видов:
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) = 'М';
Элементы массива (но не имя) являются переменными
- Массивы символьных строк и их инициализация
- Массивы символьных строк
- Массив или указатель
- Динамические массивы
- Новые функции API для работы с Blob и массивами
- 8.1.4. Сравнение массивов
- 8.1.22. Чередование массивов
- 9.1 Массивы RAID
- 9.2 Реализация массива ftAID на платформе Windows NT
- 8.2.8. Копирование хэша в массив
- Как сделать указатель мыши цветным или изменить его форму?
- Материнская плата имеет возможность организации RAID-массивов из двух SATA-дисков. Можно ли подключить к ней только один...