Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Общие сведения об указателях



Объявление указателя имеет следующий вид:

type *ptr;

где ptr – указатель на значение типа type;

* - символ унарной операции косвенной адресации.

Например:

int *z;//z – указатель на целое число типа int

float *a; //а – указатель на вещественное число типа float

void *p;//p – указатель на тип void (бестиповый указатель)

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

Например:

int x, y=5;

int *yptr, *count=NULL; //указателю count присваивается нулевой адрес

int *xptr=&x;//указателю хptr присваивается адрес переменной х

...........

yptr=&y;//указателю yptr присваивается адрес переменной y

Здесь & - символ унарной операции взятия адреса; NULL – символическая константа, равная нулевому адресу, по которому никогда не располагаются данные (этот адрес зарезервирован операционной системой для своих нужд).

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

Например:

x=*yptr;//присваивание числа y=5, находящегося по адресу yptr

Этот же результат можно получить, записав

x=y; // обычное присваивание без применения указателя

или

*xptr=*yptr;//по адресу xptr помещается значение,

//расположенное по адресу yptr

Операцию * нельзя применять к бестиповому указателю, так как неизвестно какой размер памяти нужно разыменовать. Прежде чем использовать такой указатель, ему необходимо присвоить значение указателя на нужный тип данных.

Например:

float *d, c=2; void *q;

q=d;//указатель q и d - синонимы указывают на тип float

*q=c; // по адресу q помещается значение с типа float

Указатель может изменять свое значение, т.е. ему можно присвоить адрес другой переменной того же типа.

Например:

yptr=&x; //yptr будет указывать на х

Подобно другим переменным указатель имеет собственный адрес в памяти. Он может быть получен путем применения операции & к имени указателя.

Например:

cout<<&yptr;//печать адреса указателя yptr

Можно так же определить указатель на указатель и так далее сколько нужно раз.

Например:

int z=37;

int *pz=&z; //pz – указатель на z

int **ppz=&pz; //ppz – указатель на указатель pz

В данном случае при вызове **ppz последовательно обеспечивается доступ к участку памяти *ppz= =pz, затем *pz= =z, т.е. **ppz дает значение 37.

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

¨ унарные операции ++,--;

¨ аддитивные и составные операции с целыми числами +, -, +=, -=;

¨ вычитание указателей (сложение указателей запрещено);

¨ операции отношения.

Последние имеют смысл в основном при работе со структурами данных, последовательно размещенными в памяти, например с массивами.Исключение составляют операции == и!=, которые используются для любых типизированных указателей.

Массивы и указатели в С++ тесно связаны и могут быть использованы практически эквивалентно. Имя массива можно понимать как константный указатель на первый элемент массива. Его отличие от обычного указателя в том, что его нельзя модифицировать. Однако константный указатель можно присваивать переменной типа указатель.

Например:

int b[5], *pt;

pt=b; //эта запись эквивалентна pt=&b[0]

После инициализации указателя его можно использовать для ссылок на элементы массива b[i] с помощью записи *(pt+i). Указатели можно индексировать точно так же, как и массивы. Например, выражение pt[i] ссылается на элемент массива b[i]. Учитывая, что b=&b[0], в целом можно считать, что b[i] – индексированный указатель. Эта взаимосвязь отражена графически на рис. 7.1.

       
 
   
 


Рис. 7.1. Взаимосвязь указателя с одномерным массивом

Двумерные массивы заданной размерности располагаются в памяти подобно одномерным массивам, занимая построчно смежные ячейки. Поэтому для работы с таким массивом достаточно одного указателя.

Например:

float mas [4] [2], *ptr;

ptr=mas; // или ptr=& mas[0] [0]

На рис. 7.2 представлена схема расположения массива mas в памяти компьютера.


Рис. 7.2. Взаимосвязь указателя и двумерного массива

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

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





Дата публикования: 2014-11-02; Прочитано: 263 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...