Понятие указателя

Указатели

Поиск в отсортированном массиве

В отсортированном массиве используется дихотомический (бинарный) поиск.

Массив делится пополам S:=(L+R)/2+1 и определяется, в какой части массива находится нужный элемент Х. Т.к. массив упорядочен, то если a[S] < X, то искомый элемент находится в правой части массива, иначе – находится в левой части. Выбранную часть массива снова надо разделить пополам и т.д., до тех пор, пока границы отрезка L и R не станут равны [11].

 

Пример 46

int b;

cout<<”\nX=?”;

cin>>x; // ввод искомого элемента

int l=0, r=n-1, s;

do

{

s=(l+r)/2; //средний элемент

if(a[s]<x) l=s+1; //перенести левую границу

else r=s; //перенести правую границу

}

while(l!=r);

if(a[l]==x) return l;

else return -1

При объявлении указателя на объект данных перед его именем ставится символ *, являющийся признаком косвенной адресации, а перед символом * задаётся тип косвенно адресуемого объекта:

 

type *pointer;

 

Здесь через pointer обозначено имя переменной – указателя, которое подчиняется тем же правилам именования, что и для обычных переменных.

Тип может быть любым, кроме ссылки.

 

При объявлении переменной – указателя на функцию имя указателя вместе с предшествующим символом * заключается в круглые скобки, вне которых задаётся профиль косвенно адресуемых функций:

 

type (*pointer)(список аргументов с их типами);

 

Под профилем функции здесь и далее понимается тип возвращаемого функцией значения type, а также список и типы каждого аргумента функции.

 

Замечание. С точки зрения синтаксиса языка безразлично, где будет находиться пробел – справа или слева от символа *. Его вообще может не быть.

Пример 47

 

char *p; // указатель на символ

int *q; // указатель на целое

int *ip = &ia[2]; // указателю на целое присвоен адрес третьего

// элемента массива ia

int **t; // указатель на указатель на целую переменную

char *pa[7]; // массив из 7 указателей на символы

double (*fp)(double); // указатель на функцию, аргументом

// которой является число типа double, и

// которая возвращает результат типа double

 

 

Перед использованием в программе указатель должен содержать адрес объекта требуемого типа. Перед присваиванием указателю адрес переменной, элемента массива, функции или другого объекта может быть получен с помощью оператора взятия адреса &. Например:

 

p = &v[3]; //указатель содержит адрес 4-го элемента массива v

q = &inch; //указатель содержит адрес переменной inch

fp = &sqrt; //указатель содержит адрес функции sqrt()

 

Для инициализации указателя существуют следующие способы (рис. 20):

Присваивание адреса существующего объекта:

1) с помощью операции получения адреса

int a=5;

int *p=&a; или int p(&a);

2) с помощью проинициализированного указателя

int *r=p;

 

Рис. 20. Инициализация указателя

3) адрес присваивается в явном виде

char *cp=(char*)0х В800 0000;

где 0х В800 0000 – шестнадцатеричная константа, (char*) – операция приведения типа.

4) присваивание пустого значения:

int *N=NULL;

int *R=0;