Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KL_PrJAVU230200.doc
Скачиваний:
23
Добавлен:
17.03.2015
Размер:
702.46 Кб
Скачать

Указатели

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

Зачем нужны указатели:

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

  • Обращение к памяти через адрес осуществляется быстрее, особенно для массива.

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

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

Замечание!!! При работе с адресами следует соблюдать осторожность т.к. при записи в оперативную память по «неправильному» адресу может привести к аварийному завершению программы или всей операционной системы.

Объявление указателя.

Синтаксис: имя_типа*имя_переменной_указателя;

Пример:

  1. int * p1; // переменнаяp1объявлена как указатель на целый тип данных, т.е. она может содержать адрес любой переменной целого типа.

  2. float * p2; // переменнаяp2объявлена как указатель переменной типаfloatт.е. она может содержать адрес переменной типаfloat.

  3. void * p3;// переменнаяp3является указателем на типvoidт.е. может содержать адрес любого типа, но указатель на типvoidиспользуют только для хранения или передачи адреса. Над переменнойp3 нельзя производить операций, которые допустимы для указателя.

Инициализация указателей. После объявления переменной - указателя программист обязан поместить в нее “правильный” адрес, только после этого возможны операции над указателями.

Имеются несколько способов инициализации:

  • инициализация указателя адресом существующей переменной этого же типа.

float a, *p1;

p1=& a;

  • Инициализация указателя с помощью другого указателя, уже правильно инициализированного.

char simv, *p1, *p2;

p1=& simv;

p2=p1;

  • Инициализация указателя адресом памяти, выделенной динамически.

Способы выделения памяти под данные:

статическое выделение памяти происходит на этапе компиляции, переменная "живет" и доступна в соответствии с классом памяти.

динамическая память выделяется в процессе выполнения программы по желанию программиста и освобождается также по желанию программиста в любом месте программы

int *p1 = new int; - выделяется память под одну переменную целого типа

int *p2 = new int(5); - выделяется память под одну переменную целого типа и туда помещается значение 5

int *p3 = new int[7]; - выделяется память под семь переменных целого типа, лежащих в памяти подряд

В нужном месте программы память обязательно нужно освободить, иначе она будет занята

delete p1;

delete p2;

delete[]p3;

. Указатель на тип void совместим с любым указателем.

out a, *p1;

void *p2;

p1 = & a;

p2 = (void) p1;

Операции над указателем.

1. Операция обращения по адресу (операция разадресации) * - унарная.

Пример:

1) int a, *p1;

p1 = & a;

*p1 = 7; // операция разадресации- значение по адресу p1 равно 7.

2) float p2;

p2 = new float;

*p = 2.5;

3) char simv, *p3;

void *p4;

p3 = & simv;

....................

p4 = (void*) p3;

....................

*((char*) p4) = ‘a;

2. Два адреса можно сравнить с помощью операции отношения = =, ! =, <, < =, >, > =.

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

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

5. Можно найти разность между двумя указателями, и определить на каком расстоянии находится два объекта между собой.

Задача.

Выделить память под три переменные типа float находящихся в оперативной памяти подряд, присвоить значение 1,2,3.

float *x;

x = new float[3];

*x = 1;

*(x+1) = 2;

*(x+2) = 3;

Массивы в языке С++

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

Массив – это набор данных одного типа, имеющих одно и тоже имя, и отличающихся друг от друга по индексу данного массиве. Данные называются элементами массива. Элементы массива размещаются в памяти друг за другом подряд.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]