Указатели и cсылки.

Содержание

Слайд 2

УКАЗАТЕЛИ И CСЫЛКИ. Программист может определить собственные переменные для хранения адресов

УКАЗАТЕЛИ И CСЫЛКИ.

Программист может определить собственные переменные для хранения адресов областей

памяти.
Такие переменные называются указателями.
Для удобства записи программного кода и улучшения читаемости программы в языке C определено понятие ссылки.
Ссылка представляет собой синоним имени, указанного при инициализации ссылки
Слайд 3

Указатели Инициализация указателей. Операции с указателями.

Указатели

Инициализация указателей.
Операции с указателями.

Слайд 4

УКАЗАТЕЛИ. Указатель не является самостоятельным типом. Указатель всегда связан с каким-либо

УКАЗАТЕЛИ.

Указатель не является самостоятельным типом.
Указатель всегда связан с каким-либо другим конкретным

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

Указатели В C++ различают три вида указателей: указатели на объект указатели

Указатели

В C++ различают три вида указателей:
указатели на объект
указатели на функцию
указатели на

void

Каждый вид указателей отличается своими свойствами и набором допустимых операций.

Слайд 6

Указатели Указатель на функцию Синтаксис: тип (*имя) ( список_типов_аргументов ); Например:

Указатели


Указатель на функцию

Синтаксис:

тип (*имя) ( список_типов_аргументов );

Например:

int (*fun) (double, double);

задает

указатель с именем fun на функцию, возвращающую значение типа int и имеющую два аргумента типа double.

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

Указатели на функции используются для косвенного вызова функции, а также для передачи имени функции в другую функцию в качестве параметра

Слайд 7

Указатели Указатель на объект тип *имя; Простейшее объявление указателя на объект

Указатели

Указатель на объект

тип *имя;

Простейшее объявление указателя на объект имеет вид:

содержит адрес

области памяти, в которой хранятся данные определенного типа

основного или составного

тип может быть любым, кроме ссылки и битового поля, причем тип может быть к этому моменту только объявлен, но еще не определен

следовательно, в структуре может присутствовать указатель на структуру того же типа

Слайд 8

Указатели Звездочка относится непосредственно к имени, поэтому для того, чтобы объявить

Указатели

Звездочка относится непосредственно к имени,
поэтому для того, чтобы объявить несколько

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

Например:

int *а, b, *с;

описываются два указателя на целое с именами а и с, а также целая переменная b

Размер указателя зависит от модели памяти.
Можно определить указатель на указатель и т. д.

Слайд 9

Указатели Указатель на void Указателю на void можно присвоить значение указателя

Указатели

Указатель на void

Указателю на void можно присвоить значение указателя любого типа,

а также сравнивать его с любыми указателями.

Перед выполнением каких-либо действий с областью памяти, на которую ссылается указатель на void, требуется преобразовать его к конкретному типу явным образом

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

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

Слайд 10

Указатели Примеры: int i; // целая переменная const int ci =1;

Указатели

Примеры:

int i; // целая переменная
const int ci =1; // целая константа
int

*pi; // указатель на целую переменную
const int *pci; // указатель на целую константу

int * const cp =&i;
/*указатель-константа на целую переменную */
const int * const cpc = &ci;
/* указатель-константа на целую константу */

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

Указатель может быть константой или переменной, а также указывать на константу или переменную

Слайд 11

Инициализация указателей При определении указателя надо стремиться выполнить его инициализацию, то

Инициализация указателей

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

присвоение начального значения.
Непреднамеренное использование неинициализированных указателей — распространенный источник ошибок в программах.
Слайд 12

Инициализация указателей Существуют следующие способы инициализации указателя: 1. Присваивание указателю адреса

Инициализация указателей

Существуют следующие способы инициализации указателя:
1. Присваивание указателю адреса существующего объекта
2.

Присваивание указателю адреса области памяти в явном виде
3. Присваивание пустого значения
4. Выделение участка динамической памяти и присваивание ее адреса указателю
Слайд 13

Способы инициализации указателей 1. Присваивание указателю адреса существующего объекта: с помощью

Способы инициализации указателей

1. Присваивание указателю адреса существующего объекта:
с помощью операции получения

адреса:
int а = 5; // целая переменная
int* р = &а; // в указатель записывается адрес а
с помощью значения другого инициализированного указателя: int* r = p;
с помощью имени массива или функции, которые трактуются как адрес:
int b[10]; // массив
int* t = b; // присваивание адреса начала массива
....
void f(int a ){ /* ... */ } // определение функции
void (*pf)(int); // указатель на функцию
pf = f; // присваивание адреса функции
Слайд 14

Способы инициализации указателей 2. Присваивание указателю адреса области памяти в явном

Способы инициализации указателей

2. Присваивание указателю адреса области памяти в явном виде:
char*

vp = (char *) 0хВ8000000;
3. Присваивание пустого значения:
int *suxx = NULL;
int *rulez = 0;
Слайд 15

Способы инициализации указателей 4. Выделение участка динамической памяти и присваивание ее

Способы инициализации указателей

4. Выделение участка динамической памяти и присваивание ее адреса

указателю:
с помощью операции new:
int *n = new int; // 1
int *m = new int (10); // 2
int *q = new int [10]; // 3
с помощью функции malloc:
int *u = (int *)malloc(sizeof(int)); // 4
Слайд 16

Способы инициализации указателей Некоторые замечания: Память под сам указатель выделяется на

Способы инициализации указателей

Некоторые замечания:

Память под сам указатель выделяется на этапе компиляции.

Если

память выделить не удалось, по стандарту должно порождаться исключение bad_alloc.

старые версии компиляторов могут возвращать 0.

Операцию new использовать предпочтительнее, чем функцию malloc.

особенно при работе с объектами.

Для того чтобы использовать malloc, требуется подключить к программе заголовочный файл .

Слайд 17

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

Способы инициализации указателей

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

описывать составные типы и указатели на составные типы

Например:

int *(*р[10])();

объявляется массив из 10 указателей на функции без параметров, возвращающих указатели на int.

При интерпретации сложных описаний необходимо придерживаться правила «изнутри наружу»:

1

если справа от имени имеются квадратные скобки, это массив, если скобки круглые — это функция;

2

если слева есть звездочка, это указатель на проинтерпретированную ранее конструкцию;

3

если справа встречается закрывающая круглая скобка, необходимо применить приведенные выше правила внутри скобок, а затем переходить наружу;

4

в последнюю очередь интерпретируется спецификатор типа.

Слайд 18

Способы инициализации указателей Для описания int *(*р[10])(); порядок интерпретации указан цифрами:

Способы инициализации указателей

Для описания
int *(*р[10])();
порядок интерпретации указан цифрами:

По умолчанию квадратные и

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

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

Освобождение памяти, выделенной под указатели

Освобождение памяти, выделенной с помощью операции new,

должно выполняться с помощью delete, а памяти, выделенной функцией malloc — посредством функции free.

delete n; delete m; delete [] q; free (u);

Если память выделялась с помощью new[], для освобождения памяти необходимо применять delete[].
Размерность массива при этом не указывается.

Если квадратных скобок нет, то сообщение об ошибке не выдается, но помечен как свободный будет только первый элемент массива, а остальные окажутся недоступны для дальнейших операций.
Такие ячейки памяти называются мусором.

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

Следовательно, динамическая переменная, на которую ссылался указатель, становится недоступной.
При этом память из-под самой динамической переменной не освобождается.

Слайд 20

Операции с указателями С указателями можно выполнять следующие операции: разадресация, или

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

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

к объекту (*)
присваивание
сложение с константой
вычитание
инкремент (++)
декремент (--)
сравнение
приведение типов
Слайд 21

При работе с указателями часто используется операция получения адреса (&).

При работе с указателями часто используется операция получения адреса (&).

Слайд 22

Операции с указателями Операция разадресации. предназначена для доступа к величине, адрес которой хранится в указателе

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

Операция разадресации.

предназначена для доступа к величине, адрес которой хранится

в указателе
Слайд 23

Операции с указателями На одну и ту же область памяти может

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

На одну и ту же область памяти может ссылаться

несколько указателей различного типа.

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

Например:

#include
int main(){
unsigned long int A = 0Xcc77ffaa;
unsigned short int* pint = (unsigned short int*) &A;
unsigned char* pchar = (unsigned char *) &A;
printf("| %x | %x | %x |", A, *pint, *pchar);
return 0; }

на IBM PC-совместимом компьютере будет выведена на экран строка:

| cc77ffaa | ffaa | аа |

Слайд 24

Арифметические операции с указателями Арифметические операции с указателями (сложение с константой,

Арифметические операции с указателями

Арифметические операции с указателями
(сложение с константой, вычитание,

инкремент и декремент) автоматически учитывают размер типа величин,
адресуемых указателями.

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

Слайд 25

Арифметические операции с указателями Инкремент перемещает указатель к следующему элементу массива

Арифметические операции с указателями

Инкремент

перемещает указатель к следующему элементу массива

Декремент

перемещает указатель к

предыдущему элементу массива

Фактически значение указателя изменяется на величину sizeof(тип).

Если указатель на определенный тип увеличивается или уменьшается на константу, его значение изменяется на величину этой константы, умноженную на размер объекта данного типа

Слайд 26

Арифметические операции с указателями Разность разность двух указателей — это разность

Арифметические операции с указателями

Разность

разность двух указателей — это разность их значений,

деленная на размер типа в байтах

в применении к массивам разность указателей, например, на третий и шестой элементы равна 3

Суммирование двух указателей не допускается!

Слайд 27

С с ы л к и

С с ы л к и

Слайд 28

ССЫЛКИ. Для удобства записи программного кода и улучшения читаемости программы в

ССЫЛКИ.

Для удобства записи программного кода и улучшения читаемости программы в языке

C определено понятие ссылки.
Ссылка представляет собой синоним имени, указанного при инициализации ссылки.
Ссылку можно рассматривать как указатель, который всегда разыменовывается.
Слайд 29

С С Ы Л К И Формат объявления ссылки: тип &

С С Ы Л К И

Формат объявления ссылки:

тип & имя;

где
тип — это

тип величины, на которую указывает ссылка.
& — оператор ссылки, означающий, что следующее за ним имя является именем переменной ссылочного типа.
Слайд 30

С С Ы Л К И Ссылки применяются чаще всего в

С С Ы Л К И

Ссылки применяются чаще всего в качестве

параметров функций и типов возвращаемых функциями значений.

Ссылки позволяют использовать в функциях переменные, передаваемые по адресу, без операции разадресации, что улучшает читаемость программы.

Ссылка, в отличие от указателя,
не занимает дополнительного пространства в памяти
и является просто другим именем величины.

Операция над ссылкой приводит к изменению величины,
на которую она ссылается.

Слайд 31

С С Ы Л К И Примеры :

С С Ы Л К И

Примеры :