Бублик Володимир Васильович Процедурне програмування C/C++ Лекція 4. Базові поняття програмування. Указники і відсилки презентация

Содержание


Презентации» Образование» Бублик Володимир Васильович Процедурне програмування C/C++ Лекція 4. Базові поняття програмування. Указники і відсилки
Бублик Володимир Васильович  Процедурне програмування C/C++  Лекція 4. БазовіПризначення указників
 Указник (pointer) набуває значеннями адреси пам'яті, а також особливеТипізація указників
  Кожному указнику приписано його тип:
 указник цілого;
 указникВизначення указника
 int *ptrI;
 float *px, y, z;
 float *px, *py,Pointer vs. goto
 Указники приводять до тих же проблем в структурахОперація адресування
 x=0.25; px = &x;
 & одномісна операція адресування
 Операція розіменування
 cout<< *px;
 * одномісна операція розіменування
   Адресування і розіменування
 Взаємна оберненість операцій над пам'яттю
   Динамічне виділення пам'яті
 float *p = new float;
 new операція виділенняНестача пам'яті
 Стандартна реакція: виникнення аварійної ситуації bad_alloc
 Обробка засобами системиДинамічне виділення і ініціалізація пам'яті
 float *p = new float (0.333333);
Правило гарного тону
 Якщо ви виділили динамічну пам’ять за допомогою командиЗвільнення памяті
 	double *pd = new double (5.2);
 	cout<<pd<<endl;		// 0x004419B0 	
Звільнення памяті
 	double *pd = new double (5.2);
 	cout<<pd<<endl;		// 0x004419B0 	
Висновок про управління пам'яттю
 Кожному new свій delete
 Перевіряйте наявність вільноїСталі величини і указники
 Указник сталої 
 const float pi =Права указника сталої
 float x = 1;
 const float* px =Сталі величини і указники
 Сталий указник
 float x = 0.25;
 floatСталі величини і указники
 Сталий указник сталої 
 const float piБезтипові указники
 void *voidPtr;	//Що б це значило?Безтипові указники
 void *voidPtr;	//Що б це значило?Безтипові указники
 void *voidPtr;	//Що б це значило?Безтипові указники
 void *voidPtr;	//Що б це значило?Безтипові указники
 void *voidPtr;	//Що б це значило?Безтипові указники
 void *voidPtr;	//Що б це значило?
 float *pf = newСимвольний указник
 Поганий указник
 	char *c = new char;
 	cout<<*c<<endl;
 ІніціалізованийОперацій над указниками
 float *p1= new float (1), *p2= new floatВідсилка (псевдонім) (reference)
 Відсилка або псевдонім — це альтернативне ім’я об’єкта,Відсилка (псевдонім) (reference)
 float x = 1.024;	//визначення змінної х
 float &xRefКопіювання
 float x = 1,024;	//визначення змінної x
 float xCopy = x;	//визначенняПорівняння відсилок і указників
 Визначення указника
 float x = 1,024;	//визначення змінноїПорівняння відсилок і указників
 Перенаправлення указника
 px = new float (3.33333);
Порівняння відсилок і указників
 Указнику p відповідає два елементи пам'яті, коженВідсилка і сталий указник
 float x = 1.024;		//визначення змінної х
 floatСтала відсилка
 const float pi = 3.14159;
 const float &piRef =Стала відсилка
 Що б це значило?
 float x = 1;
 constУказники указників
 	double **ppd = new double*;
 	*ppd = new doubleВисновки
 Крім безпосередніх операцій з пам'яттю указники використовуються для передачі змінних



Слайды и текст этой презентации
Слайд 1
Описание слайда:
Бублик Володимир Васильович Процедурне програмування C/C++ Лекція 4. Базові поняття програмування. Указники і відсилки Лекції для студентів 2 курсу


Слайд 2
Описание слайда:
Призначення указників Указник (pointer) набуває значеннями адреси пам'яті, а також особливе нульове значення, з яким не зв'язана жодна адреса Динамічне виділення і звільнення пам'яті: створення масивів; створення динамічних структур даних (списків, дерев, тощо)

Слайд 3
Описание слайда:
Типізація указників Кожному указнику приписано його тип: указник цілого; указник символу; указник дійсного, тощо. З одним указником можна зв'язати цілий агрегат даних одного й того ж типу, розміщених одне за одним, починаючи з місця, позначеного указником

Слайд 4
Описание слайда:
Визначення указника int *ptrI; float *px, y, z; float *px, *py, *pz; Визначення без ініціалізації приводять до заповнення пам'яті сміттям. Засмічені указники (dangling pointer) небезпечні! float x, *px;

Слайд 5
Описание слайда:
Pointer vs. goto Указники приводять до тих же проблем в структурах даних, до яких приводять оператори переходу в структурах керування. Скрізь, де можна, уникаємо указників. Якщо вживаємо, то дотримуємось суворої дисципліни! Якщо значення указника невідоме, ініціалізуємо його нулем float *px = 0; Якщо значення указника не нуль, то з ним зв'язані два елементи пам'яті!

Слайд 6
Описание слайда:
Операція адресування x=0.25; px = &x; & одномісна операція адресування lvalue(px) rvalue(px) == lvalue (x) == rvalue(&x)

Слайд 7
Описание слайда:
Операція розіменування cout<< *px; * одномісна операція розіменування rvalue(px) == lvalue(x) rvalue(*px) == rvalue(x)

Слайд 8
Описание слайда:
Адресування і розіменування Взаємна оберненість операцій над пам'яттю &(*px) == px px == *(&px)

Слайд 9
Описание слайда:
Динамічне виділення пам'яті float *p = new float; new операція виділення нового елемента пам'яті, його адреса зберігається в p, значення *p заповнено сміттям px = new float; if (px == 0) // вільної пам’яті немає

Слайд 10
Описание слайда:
Нестача пам'яті Стандартна реакція: виникнення аварійної ситуації bad_alloc Обробка засобами системи програмування (аварійне припинення виконання програми) Програмна обробка переривання (оператор catch в блоці випробувань try – буде далі) Замовна реакція: повернення нульового указника Формат виклику new (nothrow) Приклад double *px = new (nothrow) double [bigAmount]; if (px==0) //Вільної пам'яті не вистачило

Слайд 11
Описание слайда:
Динамічне виділення і ініціалізація пам'яті float *p = new float (0.333333); Тепер значення *p коректне

Слайд 12
Описание слайда:
Правило гарного тону Якщо ви виділили динамічну пам’ять за допомогою команди new не забудьте своєчасно звільнити її командою delete та обнулити указник float *p = new float (0.333333); // робіть все, що вам потрібно delete p; // потурбуйтесь про захист від завислих указників p = 0;

Слайд 13
Описание слайда:
Звільнення памяті double *pd = new double (5.2); cout<<pd<<endl; // 0x004419B0 cout<<*pd<<endl; //5.2 delete pd; cout<<pd<<endl; // 0x004419B0 cout<<*pd<<endl; //-1.45682e+144 double *new_pd = new double; cout<<new_pd<<endl; // 0x004419B0 cout<<*pd<<endl; //-6.27744t+066 cout<<*new_pd<<endl;

Слайд 14
Описание слайда:
Звільнення памяті double *pd = new double (5.2); cout<<pd<<endl; // 0x004419B0 cout<<*pd<<endl; //5.2 delete pd; // Правило гарного тону pd = 0;

Слайд 15
Описание слайда:
Висновок про управління пам'яттю Кожному new свій delete Перевіряйте наявність вільної пам'яті Слідкуйте за тривалістю життя динамічних об'єктів у пам'яті

Слайд 16
Описание слайда:
Сталі величини і указники Указник сталої const float pi = 3.14159; const float *piPtr = &pi ; //*piPtr = 4; ERROR! // float *piNonConstPtr =&pi; теж ERROR

Слайд 17
Описание слайда:
Права указника сталої float x = 1; const float* px = &x; x =3; cout<<*px<<endl; //*px = 4; як і раніше ERROR! Указнику сталої не надано права змінювати об'єкт, але безпосередня зміна об'єкту, якщо він не сталий, і надалі можлива

Слайд 18
Описание слайда:
Сталі величини і указники Сталий указник float x = 0.25; float *const px = &x; // Сталий указник не можна перемістити // px = &y; ERROR!

Слайд 19
Описание слайда:
Сталі величини і указники Сталий указник сталої const float pi = 3.14159; const float *const piPtr = &pi; //*piPtr = 4; ERROR! //piPtr = &nAvogadro; ERROR!

Слайд 20
Описание слайда:
Безтипові указники void *voidPtr; //Що б це значило?

Слайд 21
Описание слайда:
Безтипові указники void *voidPtr; //Що б це значило?

Слайд 22
Описание слайда:
Безтипові указники void *voidPtr; //Що б це значило?

Слайд 23
Описание слайда:
Безтипові указники void *voidPtr; //Що б це значило?

Слайд 24
Описание слайда:
Безтипові указники void *voidPtr; //Що б це значило?

Слайд 25
Описание слайда:
Безтипові указники void *voidPtr; //Що б це значило? float *pf = new float (3.1); double *pd = new double (5.2); voidPtr = pf; cout<<voidPtr<<endl; // 0x004419F0 // cout<<*voidPtr<<endl; розіменування неможливе voidPtr = pd; cout<<voidPtr<<endl; // 0x004419B0

Слайд 26
Описание слайда:
Символьний указник Поганий указник char *c = new char; cout<<*c<<endl; Ініціалізований указник char *cc = new char ('a'); cout<<*cc<<endl; Особливість ініціалізації рядків // char *str = new char(“String?“); char *str = "Operation New is not needed"; cout<<str<<endl;

Слайд 27
Описание слайда:
Операцій над указниками float *p1= new float (1), *p2= new float (2); cout<<p2; //0x004418F0 Порівняння на рівність або нерівність p1 == p2; p1 > p2;… if(p2>p1) cout<<"p2>p1"<<endl; else cout<<"p1>p2"<<endl; Присвоєння і ініціалізація p1 = p2; p1 =&x; p1 = new float (3); char *pc = new char [100]; Збільшення, зменшення p1++; ++p1; p1--;--p1; p1+10; p1-10; cout<<p2+1; //0x004418F4

Слайд 28
Описание слайда:
Відсилка (псевдонім) (reference) Відсилка або псевдонім — це альтернативне ім’я об’єкта, яке позначає об’єкт на рівних правах з його основним іменем. При створенні псевдонім зв'язується зі своїм об'єктом (відсилає до нього) і ця відсилка дійсна протягом усього життя псевдоніму. Для чого? Для того, щоб у різних частинах програми іменувати одну й ту ж область пам'яті зручним і зрозумілим для цієї частини іменем

Слайд 29
Описание слайда:
Відсилка (псевдонім) (reference) float x = 1.024; //визначення змінної х float &xRef = x; //визначення її псевдоніму xRef *= 2; // x == xRef == 2.048

Слайд 30
Описание слайда:
Копіювання float x = 1,024; //визначення змінної x float xCopy = x; //визначення її копії xCopy += x; //подвоєння xCopy, x незмінний

Слайд 31
Описание слайда:
Порівняння відсилок і указників Визначення указника float x = 1,024; //визначення змінної х float *px = &x; //визначення указника на неї

Слайд 32
Описание слайда:
Порівняння відсилок і указників Перенаправлення указника px = new float (3.33333); // x == 1,024; *px == 3.33333 //Зв’язок між px і x розірвано

Слайд 33
Описание слайда:
Порівняння відсилок і указників Указнику p відповідає два елементи пам'яті, кожен з яких має власне значення. Зміна значення p розриває наявний зв’язок між елементами пам'яті, наприклад, px = 0;

Слайд 34
Описание слайда:
Відсилка і сталий указник float x = 1.024; //визначення змінної х float *const px = &x; //сталий указник на неї //схожість до відсилки: зв’язок нерозривний //відмінність: наявність двох елементів пам'яті

Слайд 35
Описание слайда:
Стала відсилка const float pi = 3.14159; const float &piRef = pi; // float &piNonConstRef = pi; ERROR

Слайд 36
Описание слайда:
Стала відсилка Що б це значило? float x = 1; const float & rx = x; x =2; cout<<rx<<endl; Якщо псевдонім сталий, то він не має права змінити об'єкт, але безпосередня зміна об'єкту, якщо він не сталий можлива

Слайд 37
Описание слайда:
Указники указників double **ppd = new double*; *ppd = new double (5); cout<<ppd<<endl; cout<<*ppd<<endl; cout<<**ppd<<endl; Використання указників на указники ― розповсюджена техніка програмування у “чистому” С. Проблеми управління пам'яттю при цьому зростають, бо необхідно слідкувати за обома поверхами указника. Вживати ще обережніше, ніж звичайні.

Слайд 38
Описание слайда:
Висновки Крім безпосередніх операцій з пам'яттю указники використовуються для передачі змінних параметрів при програмуванні на “чистому” С, а указники другого рівня для передачі змінних указників В сучасному програмуванні на С++ замість передачі указників використовується передача змінних параметрів відсилками


Скачать презентацию на тему Бублик Володимир Васильович Процедурне програмування C/C++ Лекція 4. Базові поняття програмування. Указники і відсилки можно ниже:

Похожие презентации