Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры прога 2.docx
Скачиваний:
2
Добавлен:
18.09.2019
Размер:
83.31 Кб
Скачать

26. Указатель на неопределенный тип.

Существует специальный тип указателя, к-рый наз указателем на неопределенный тип. Для объявления такого указателя используется ключевое слово void.

Void *идентефикатор

Объявление такого указателя позволяет “отстрочить” определение типа, на к-рый ссылается переменная. Указатель на тип void можно использовать для ссылки на объект любого типа, но к нему нельзя применить операцию * без предварительного приведения типов, т.к. компилятору неоходима информация о числе байтов, участвующих в операци.

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

27.1,Выражения и операции с указателями. Присваивание указателей

Можно присвоить один указатель другому. Эта операция имеет смысл только в том случае, если они адресуют объекты одного и того же типа.

#include <stdio.h>

main()

{int I , *ip1, *ip2;

I= 125

Ip1=&I;

Ip2=&ip1;

Printf(“%d\t%d\n”,*ip1,*ip2);

}

результат : 125 125

Сравнение указателей

Сравнение двух указателей используется чаще всего в том случае, если оба указателя адресуют объект общий для них

#include <stdio.h>

main()

{int a,b, *ip1, *ip2;

Ip1=&a;

Ip2=&b;

If (ip1!=ip2) printf(“указатели не равны”)

Else printf(“эта строка не напечатается”);

}

27.2,Выражения и операции с указателями. Применение арифметических операций к указателям

К указателям могут быть применены операции

++ , - - , + , - ,

Если ++ (- - ), то указатель увеличивается (уменьшается) на размер объекта, к-рый он адресует

Тип * ptr;

Ptr ++ = содержимое ptr + sizeof(тип);

Операции + и – тоже имеют свою специфику. Складывать и вычитать указатели можно с целым числом.

Недопустимы:

1)сложение двух указателей

2)вычитание двух указателей на разные объекты

3)вычитания из указателя числа с плавающей точкой

4)вычитание указателей

5)деление указателей

6)порозрядные операции и операции сдвига

7)указатель одного типа присвоить указателю другого типа, без приведения типов

29. Массивы и указатели.

Доступ к массиву можно осуществить двумя способами:

1)с помощью индексного выражения

2)в виде указателя со смещением

Элемент массива можно изобразить в виде указателя со смещением и в виде имени массива с указанием элемента. Эти две записи можно и сочетать. В общем случае индексное выражение имеет вид : выр1[выр2], где выр1 – это указатель, выр2 – целое число.

n-ый элемент массива может быть записан как : a[n], n[a], *(a+n), *(n+a), pa[n], n[pa], *(pa+n), *(n+pa)

30.Операции с указателями на массив. Адресная арифметика.

Если есть уверенность, что элементы массива существуют, то возможно индексирование в обратную сторону. Если два указателя р1 и р2 указывают на элементы одного и того же массива, то к ним применимы следующие операции :

p1++( - -) – устанавливает указатель на следующий(предыдущий) элемент массива

p1+n (p1-n)- устанавливает указатель на n-ый после(перед) элемент массива

p2 - p1 - дает число элементов массива между р1 и р2

p1= = p2 - дает результат 1,если р1 и р2 указывают на один элемент, иначе 0

p1 ! = p2 -дает результат 1,если р1 и р2 указывают на разные элементы, иначе 0

p1 > (> =) p2 - дает результат 1,если р1 указывает на элемент с большим (большим либо равным) индексом чем р2

p1 < (< =) p2 -дает результат 1,если р1 указывает на элемент с меньшим (меньшим либо равным) индексом чем р2

Любой указатель можно сравнивать с 0. Константу 0 можно присваивать указателю = NULL Для указателей, ссылающихся на элементы разных массивов, результат арифметических операций и операций сравнения неопределен.

Пр: длина строки

Int strlen (char *s)

{ char *p = s

while (*p!= ‘\0’)

p+ +;

return p-s;

}

Существует исключение: в арифметике с указателем можно использовать адрес несуществующих переменных массива, следующих за последним элементом