Понятие указателя
Указатели
Поиск в отсортированном массиве
В отсортированном массиве используется дихотомический (бинарный) поиск.
Массив делится пополам 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;