Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прог.doc
Скачиваний:
3
Добавлен:
19.04.2019
Размер:
3.87 Mб
Скачать

20. Указатель. Адресная арифметика

Указатель – это переменная, в которой хранится адрес другой переменной или участка па-

мяти.

Указатели объявляются в списке переменных, но

перед их именем ставится знак *. Указатель всегда

указывает на переменную того типа, для которого

он был объявлен.

f = *pF;

Такая запись означает: «записать в переменную f

то вещественное число, на которое указывает указа-

тель pF». Запись *pF обозначает содержимое ячей-

ки, на которую указывает pF.

Указатели часто используют при динамическом выделении памяти. Для того чтобы воспользоваться функциями динамической работы с памятью нужно включить заголовочный файл ALLOC.H:

#include <alloc.h>

а вот пример динамического выделения памяти:

int *p1;

p1 = (int*)malloc( sizeof(int) );

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

  • присваивание

  • операция сравнения, сложения, вычитания.

Можно сравнивать указатели одинакового типа. Важной особенностью арифметических операций с указателями является то, что физическое увеличение или уменьшение значения указателя зависит от его типа.(*p++ увеличится на 4)

22. Связь одномерных массивов с указателями

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

23. Связь двумерных массивов с указателями

Имя двумерного массива является указателем константой на массив указателей констант.

Элементами массива указателей являются указатели константы на начало каждой из строк массива.

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

Между указателями и массивами существует определенная связь. Предположим, имеется массив из 100 целых чисел. Запишем двумя способами программу суммирования элементов этого массива:

long array[100];

long sum = 0;

for (int i = 0; i < 100; i++)

sum += array[i];

То же самое можно сделать с помощью указателей:

long array[100];

long sum = 0;

for (long* ptr = &array[0];

ptr < &array[99] + 1; ptr++)

sum += *ptr;

24. Массивы указателей !!!!!

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

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

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

Альтернатива:

Операции с указателями

Над указателями можно выполнять унарные операции: инкремент и декремент. При выполнении операций ++ и -- значение указателя увеличивается или уменьшается на длину типа, на который ссылается используемый указатель.

Пример:

int *ptr, a[10];

ptr=&a[5];

ptr++; /* равно адресу элемента a[6] */

ptr--; /* равно адресу элемента a[5] */

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

Пример:

int *ptr1, *ptr2, a[10];

int i=2;

ptr1=a+(i+4); /* равно адресу элемента a[6] */

ptr2=ptr1-i; /* равно адресу элемента a[4] */

В операции вычитания могут участвовать два указателя на один и тот же тип. Результат такой операции имеет тип int и равен числу элементов исходного типа между уменьшаемым и вычитаемым, причем если первый адрес младше, то результат имеет отрицательное значение.

Пример:

int *ptr1, *ptr2, a[10];

int i;

ptr1=a+4;

ptr2=a+9;

i=ptr1-ptr2; /* равно 5 */

i=ptr2-ptr1; /* равно -5 */

Значения двух указателей на одинаковые типы можно сравнивать в операциях ==, !=, <, <=, >, >= при этом значения указателей рассматриваются просто как целые числа, а результат сравнения равен 0 (ложь) или 1 (истина).

Пример:

int *ptr1, *ptr2, a[10];

ptr1=a+5;

ptr2=a+7;

if (prt1>ptr2) a[3]=4;

В данном примере значение ptr1 меньше значения ptr2 и поэтому оператор a[3]=4 не будет выполнен.