русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Операции разыменования и разадресации


Дата добавления: 2015-06-12; просмотров: 2192; Нарушение авторских прав


 

Указатель — это специальная переменная, которая хранит адрес другой переменной. Указатель объявляется следующим образом:

тип * переменная;

где тип — любой допустимый как простой, так и составной базовый тип указателя.Например, пусть объявлена обычная переменная

int t.

Объявление и инициализация

int *p= &t;

означают следующее. В переменной p будетхраниться не обрабатываемое программой целое число (оценка студента, количество выпущенной продукции и т. п.), а адрес ячейки, в которой будет находиться информация указанного типа (целое число). Под адресом будем понимать номер первого байта выделенного для переменной участка оперативной памяти в шестнадцатеричной системе счисления. Для переменных, не являющихся указателями, без дополнительного объявления адрес также запоминается системой, и его можно получить с помощью операции & (разадресации), например, &t. Эта унарная операция, которую иногда называют “взятие адреса”, ничего не делает со значением переменной t.

До первого использования переменная – указатель обязательно должна быть проинициализирована. До тех пор, пока не определим значение указателя, он относится к чему-то случайному в памяти, и его использование может привести к непредсказуемым результатам. Один из способов показан выше и означает, что в переменную p помещается адрес ячейки t. Важно понять, что приведённая выше запись равносильна

int *p; и p=&t ; ( а не *p=&t;)

В этом заключается одна из трудностей начального этапа изучения указателей. Эта тема усложняется ещё и тем, что такой же символ “&” используется при объявлении переменной ссылочного типа. Здесь этот символ определяет операцию взятия адреса для переменной и никакого отношения к ссылочному типу не имеет.

Заметим, что расстановка пробелов при объявлении указателей свободная. Наряду с приведенными выше допустимы также следующие записи:



int * p= & t; int* p= &t;.

Предпочтение следовало бы отдать последней записи, так как она подчёркивает, что объявляется переменная p, а не *p. Из такой записи легче понять смысл указателя. Она показывает, что типом является int*, а не int. Из синтаксических правил необходимо обратить также внимание на следующее. Если в одной строке объявляется несколько указателей, то символ “*” надо писать перед каждой переменной: float* q1, *q2;

Содержимое ячейки, адрес которой находится в p, в тексте программы обозначается с помощью операции разыменование. Для неё используется тот же символ “*”, что и при объявлении переменной-указателя. Эта унарная операция возвращает значение переменной, находящейся по указанному адресу. Поэтому *p — это обрабатываемое программой целое число, которое находится в ячейке, адрес которой в переменной-указателе p. С учётом инициализации (p=&t) *p и t — это одно и тоже значение. Поэтому если с помощью cin>>t введём, например, число 2 и выполним *p*=5, что равносильно *p=*p*5, то изменится и величина t, хотя, казалось бы, не было явного её изменения. Поэтому оператор cout << t; выведет число 10 (2*5). И, наоборот, изменив t (например, t++;) этим самым мы изменим и значение *p. С помощью cout<<(*p) выведем 11.

Сказанное выше будем обозначать следующим образом:

 

p (или &t) *p (или t)

 
 

 

 


В “левом прямоугольнике” (ячейке памяти) находится адрес, а в ячейке “справа” — обрабатываемое целое число. Этот рисунок объясняет термин “указатель”.

Заметим, что рассматриваемые здесь операции “&” и ”*” являются унарными и имеют более высокий приоритет по сравнению с аналогичными бинарными операциями “битовое и” и арифметическое умножение.

Для *p определены те же операции, что и для переменной указанного типа, у нас для целых чисел. Поэтому допустимы, например, следующие операторы:

а) cin>>(*p); б) int r; r=*p*2; в) if (*p%2) …; г)cout<<(*p);

Можно также выводить значение переменной-указателя. После выполнения cout<<p; будет выведен адрес в шестнадцатеричной системе счисления. При этом он не обязательно будет одинаковым при повторном выполнении одной и той же программы.

 



<== предыдущая лекция | следующая лекция ==>
ПРЕДИСЛОВИЕ | Инициализация и присваивание указателей


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.037 сек.