АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Указатели и массивы

Читайте также:
  1. XІІ. СИГНАЛЫ ТРЕВОГИ И СПЕЦИАЛЬНЫЕ УКАЗАТЕЛИ
  2. Динамические массивы
  3. Динамические массивы
  4. МАРШРУТНЫЕ УКАЗАТЕЛИ
  5. Массивы
  6. Массивы
  7. Многомерные символьные массивы
  8. Открытые массивы
  9. Параметры-указатели
  10. Переменные-указатели
  11. СТРЕЛОЧНЫЕ УКАЗАТЕЛИ
  12. УКАЗАТЕЛИ ГРАНИЦЫ БЛОК - УЧАСТКОВ

Указатель на константу и константный указатель

int main() { int a=100, b=222;//два обычных объекта типа int int *const P2=&a; //Константный указатель *P2=987; //Менять значение разрешено //P2=&b; //Но изменять адрес не разрешается   const int *P1=&a; //Указатель на константу //*P1=110; //Менять значение нельзя P1=&b; //Но менять адрес разрешено   const int *const P3=&a;//Константный указатель на константу //*P3=155; //Изменять нельзя ни значение //P3=&b; //Ни адрес к которому такой указатель привязан return 0; }  

Чтобы не путаться где что можно и где тут чего нельзя достаточно вспомнить определение указателя. Так как указателем называется адрес памяти, то константный указатель = неизменяемый адрес памяти.
Другое дело если мы не хотим изменять то значение, на которое указывает указатель, но предполагаем, что указатель будет указывать на разные объекты, каждый из которых изменению не подлежит. Таким образом у нас получается изменяемый указатель на неизменяемый объект или просто указатель на константу.
В описанных случаях есть что-то такое, что разрешено и чего не разрешено изменять, но можно запретить любые изменения, запретив менять и адрес и значение по этому адресу. Для такой жесткой привязки используется константный указатель на константу. Это как бы объединение ограничений двух первых вариантов друг с другом.

Каждый из трех описанных вариантов бывает нужен. Сам пример ничего на экран не выводит, так как его задача показать смысл существования таких понятий и помочь разобраться в столь запутанном материале.

Указатели и массивы

Понятия указателей и массивов тесно связаны. Рассмотрим следующий фрагмент программы:

char str[80], *p1;p1 = str;

Здесь p1 указывает на первый элемент массива str. Обратиться к пятому элементу массива str можно с помощью любого из двух выражений:

str[4]* (p1+4)

Массив начинается с нуля. Поэтому для пятого элемента массива str нужно использовать индекс 4. Можно также увеличить p1 на 4, тогда он будет указывать на пятый элемент. (Напомним, что имя массива без индекса возвращает адрес первого элемента массива.)

В языке С существуют два метода обращения к элементу массива: адресная арифметика и индексация массива. Стандартная запись массивов с индексами наглядна и удобна в использовании, однако с помощью адресной арифметики иногда удается сократить время доступа к элементам массива. Поэтому адресная арифметика часто используется в программах, где существенную роль играет быстродействие.

В следующем фрагменте программы приведены две версии функции putstr(), выводящей строку на экран. В первой версии используется индексация массива, а во второй — адресная арифметика:

/* Индексация указателя s как массива. */void putstr(char *s){ register int t; for(t=0; s[t]; ++t) putchar(s[t]);} /* Использование адресной арифметики. */void putstr(char *s){ while(*s) putchar(*s++);}

Большинство профессиональных программистов сочтут вторую версию более наглядной и удобной. Для большинства компиляторов она также более быстродействующая. Поэтому в процедурах такого типа приемы адресной арифметики используются довольно часто.


1 | 2 | 3 | 4 | 5 | 6 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)