Разделы презентаций


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

Содержание

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

Слайды и текст этой презентации

Слайд 1УКАЗАТЕЛИ И CСЫЛКИ

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

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

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

улучшения читаемости программы в языке C определено понятие ссылки.
Ссылка представляет собой синоним имени, указанного при инициализации ссылки
УКАЗАТЕЛИ И CСЫЛКИ.Программист может определить собственные переменные для хранения адресов областей памяти.Такие переменные называются указателями.Для удобства записи

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

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

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

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

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

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

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

указатели

на void

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

операций.
УказателиВ C++ различают три вида указателей:указатели на объектуказатели на функциюуказатели на voidКаждый вид указателей отличается своими свойствами

Слайд 6Указатели



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

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

int и имеющую два аргумента типа double.

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

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

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

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

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

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

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

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

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

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

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

*а, b, *с;

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

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

Можно определить указатель на указатель и т. д.

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

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

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

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

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

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

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

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

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

указатель на целую константу

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

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

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

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

УказателиПримеры:int i; 		// целая переменнаяconst int ci =1; 	// целая константаint *pi; 		// указатель на целую переменнуюconst

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

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

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

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

объекта

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

3. Присваивание

пустого значения

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

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

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

получения адреса:
int а = 5; // целая переменная
int* р = &а; //

в указатель записывается адрес а

с помощью значения другого инициализированного указателя: int* r = p;

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


Способы инициализации указателей1. Присваивание указателю адреса существующего объекта:с помощью операции получения адреса:int а = 5;	// целая переменнаяint*

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

виде:
char* vp = (char *) 0хВ8000000;

3. Присваивание пустого значения:
int *suxx

= NULL;

int *rulez = 0;

Способы инициализации указателей2. Присваивание указателю адреса области памяти в явном виде:char* vp = (char *) 0хВ8000000;3. Присваивание

Слайд 15Способы инициализации указателей
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

Способы инициализации указателей4. Выделение участка динамической памяти и присваивание ее адреса указателю:с помощью операции new:int *n =

Слайд 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[].
Размерность массива при этом не указывается.

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

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

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

Освобождение памяти, выделенной под указателиОсвобождение памяти, выделенной с помощью операции 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 определено понятие ссылки.
Ссылка представляет собой синоним имени, указанного

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

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

— это тип величины, на которую указывает ссылка.
& — оператор ссылки, означающий,

что следующее за ним имя является именем переменной ссылочного типа.
С С Ы Л К ИФормат объявления ссылки:тип & имя;гдетип —	это тип величины, на которую указывает ссылка.&

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

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

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

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

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

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

Слайд 31С С Ы Л К И
Примеры :

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

Слайд 32С С Ы Л К И
Запомните следующие правила:
Переменная-ссылка должна явно

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

описана как extern или ссылается на поле данных класса.

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

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

Не разрешается определять указатели на ссылки, создавать массивы ссылок и ссылки на ссылки

С С Ы Л К ИЗапомните следующие правила:Переменная-ссылка должна явно инициализироваться при ее описаниикроме случаев, когда она

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

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


Для правообладателей

Яндекс.Метрика