Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-7,13-15,20-32.docx
Скачиваний:
5
Добавлен:
26.09.2019
Размер:
48.11 Кб
Скачать

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

Над указателями определено 5 основных операций.

     Определение адреса указателя: &p, где p – указатель (&p – адрес ячейки, в которой находится указатель).

     Присваивание. Указателю можно присвоить адрес переменной p=&q, где p – указатель, q – идентификатор переменной.

     Определение значения, на которое ссылается указатель: *p (операция косвенной адресации).

     Увеличение (уменьшение) указателя. Увеличение выполняется как с помощью операции сложения (+), так и с помощью операции инкремента (++). Уменьшение – с помощью операции вычитания (–) либо декремента (––).

Например, пусть p1 – указатель, тогда р1++ перемещает указатель на:

o    1 байт, если *p1 имеет тип char;

o    4 байта, если *p1 имеет тип int (в 32 разрядной операционной системе) или 2 байта (в 16 разрядной операционной системе);

o    4 байта, если *p1 имеет тип float.

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

Пример программы.

Даны адреса переменных &a=63384,&b=64390,&c=64404. Что напечатает ЭВМ?

#include<stdio.h>

intmain()

{

floata,*p1;

intb,*p2;

charc,*p3;

a=2.5;b=3;c='A';

p1=&a;p2=&b; p3=&c;

p1++;p2++;p3++;

printf("\np1=%u,p2=%u,p3=%u",p1,p2,p3);

return0;

}

Ответ: р1=63388,р2=64392,р3=64405.

Операции адресной арифметики подчиняются следующим правилам. После увеличения значения переменной-указателя на 1 данный указатель будет ссылаться на следующий объект своего базового типа. После уменьшения – на предыдущий объект. Для всех указателей адрес увеличивается или уменьшается на величину, равную размеру объекта того типа, на который они указывают. Поэтому указатель всегда ссылается на объект с типом, тождественным базовому типу указателя.

Применительно к указателям на объект типа char операции адресной арифметики выполняются как обычные арифметические операции, потому что длина объекта char всегда равна 1.

Операции адресной арифметики не ограничены увеличением (инкрементом) и уменьшением (декрементом). К указателям, например, можно добавлять или вычитать из них целые числа.

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

Все остальные операции над указателями запрещены.

20. Сортировка массива

1) Метод прямого включения

Дан массив a[1..n], x-буферная переменная. Во время сортировки массив делится на 2 части – упорядоченную и неупорядоченную. При каждом шаге с i=2 (Iувеличивается на 1 при каждом проходе цикла) из исходной последовательности (неупорядоченной) извлекается i-тый элемент и перекладывается в нужное место готовой части (упорядоченной). Алгоритм: для i=2 до nвыполнить x:=a[i] включить xна соответствующее место среди a[1]..a[i]

В процессе включения xна нужное место представляет собой цикл из сравнений и обменов соседних элементов. Окончание цикла, если найдено число в массиве, меньшее x, либо xпопал на первое место в массиве. Возможные варианты: 1-внутренний цикл с заданным числом повторений, следовательно, возможны лишние сравнения, можно при этом поставить дополнительную проверку. 2-внутренний цикл с предусловием, которое объединяет оба условия (усложнение процесса). 3-установка барьера a[0]:=x. В этом случае проверяется только одно условие окончания цикла. 2) Метод прямого выбора

Действия:

- выбирается элемент с наименьшим ключом

- обменивается местами с первым элементом

- процесс повторяется с n-1 элементом, потом с n-2 и т.д., пока не останется 1 самый большой элемент.

Алгоритм:

Для i=1 до n-1 выполнить

Присвоить k– индекс наименьшего из a[i]..a[n]

Поменять местами a[i] и a[k].

Данный метод в среднем показывает число перестановок M=O*(n*ln(n)). Данный метод быстрее метода прямого включения.

3) Метод прямого обмена (метод пузырька)

Алгоритм основан на смене мест для пары соседних элементов до упорядочивания.

Алгоритм:

Для i:=2 до n выполнить

Для i:=nдо I (шаг -1) выполнить

Еслиa[j-1]>a[j] то

x:=a[j-1];

a[j-1]:=a[i] a[j]:=x;

все если

все для

все для