Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Указатели, арифметика указателей.





 

Каждая переменная (как и лю­бой другой программный объект) имеет свой адрес- т.е. координату места ее разме­щения в памяти. Память представляется как простая последовательность байтов, пронумерованных целыми положительными числами. Под координатой объекта в памяти понимается номер первого байта этого объекта в указанной системе ну­мерации. Для определения адреса используется специальная унарная префиксная операция &. Выражение &a возвращает адрес переменной a. Для работы с адреса­ми объектов используются указатели. Указатели- это специальный вид объектов, существующих в C/C++ программах. Значение указателя - это адрес некоторого объекта. Для того, чтобы обеспечить доступ к объекту, указатель должен, кроме адреса объекта, содержать информацию о его размере и структуре. Как известно, такая информация содержится в типах данных. Исходя из этого, указатели объяв­ляются следующим образом:

<тип>* <указатель>

Например:

int *iptr; // Указатель на переменную типа int

char *cptr; // Указатель на переменную типа char

С указателями допустимы следующие операции:

Присваивание значения одного указателя другому:

int *ptr1, *ptr2;

ptr1=ptr2;

Присваивание указателю значения адреса объекта соответствующего типа:

int *ptr;

int x;

ptr = &a;

Операции сравнения на равенство и неравенство.

К указателям можно применять операции сложения с целым чис­лом. Эти операции работают своеобразно и дают мощные средства управления памятью. Выясним это на конкретном примере.

Пусть объявлен указатель dptr типа double* (значениями этого указателя мо­гут быть адреса объектов типа double). Напомним, что переменные типа double занимают в памяти 8 байт. В этой ситуации выражение dptr+k (где k - целое число) будет иметь тип double* (т.е. снова является указателем на объекты типа double) и значение, равное исходному значению переменной dptr плюс 8k. То есть указатель перемещается по памяти вперед на расстояние, равное размеру места, занимаемого в памяти k элементами типа, к которому отнесен указатель. Операция вычитания работает аналогично. С операциями сложения и вычитания связаны такие опера­ции, как ++, --, += и -=. Эти операции работают так же, как и операции сложения и вычитания.

Разность двух указателей является целым числом. Это число имеет следующий смысл: на каком расстоянии друг от друга в памяти находятся объекты, адреса которых содержатся в указателях.

Кроме того, указателю можно присвоить любое целое значение, но это весьма рискованное дело - это число преобразуется в абсолютный адрес в памяти. А что там лежит???

Последняя операция, применимая к указателям, - это операция разыменования или получения значения объекта, адрес которого содержит указатель. Это опера­ция "унарная * ". Рассмотрим пример:

Пусть dptr - это указатель на объекты типа double и пусть в некоторый момент времени этот указатель содержит адрес какого-то реально су­ществующего в памяти объекта типа double (например, ранее описана переменная x типа double и указателю dptr присвоен адрес этой переменной). Синтаксически *dptr представляет собой выражение. Значение этого выражения - ссылка на объ­ект, адрес которого содержится в переменной dptr. Это выражение может исполь­зоваться в других выражениях всюду, где допустимо использование переменной соответствующего типа (в том числе и в левой части выражения присваивания). Например, выражение *dptr=12.7 обрабатывается так: в объект типа double, рас­положенный по адресу, находящемуся в переменной dptr записывается значение 12.7, которое становится значением всего выражения присваивания.

Значение выражения *(dptr+6) определяется следующим образом: область па­мяти, начинающаяся с адреса, значение которого равно значению переменной (указателя) dptr плюс 48 (48=8х6) и занимающая в памяти 8 байт, трактуется как объект типа double, ссылка на который и становится значением всего выра­жения.

Пока неясно, для чего необходимо применять указатели.

Указатели полезны в том случае, когда надо хранить и обрабатывать объекты больших размеров. Если их просто описывать так, как указано выше, то эти объ­екты будут размещены в так называемом программном стеке. А он имеет очень маленький объем. Для использования же всей оперативной памяти и необходимы указатели, так как только с их помощью мы можем получить доступ к этой памяти.

На работе с указателями построена вся работа с массивами.

Указатели существенно используются при передаче параметров в функции и, наконец, создание динамических структур данных (также рассмотренных ниже) невозможно без использования указателей.

 

 







Date: 2016-07-25; view: 353; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию