Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекції 2012-2013ооп.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
6.61 Mб
Скачать

4.8. Вказівники і посилання; масиви.

Початкуючі програмісти, як правило, працюють тільки із звичайними змінними. Для таких змінних пам'ять виділяється автоматичний при запуску програми або функції, в якій смороді оголошені, і віддаляється також автоматичний при завершенні програми або функції. Доступ до них організовується досить просто - по імені:

imemorycell_contents+= 10;

Інший спосіб діставання доступу до значення змінної полягає у використанні іншої змінної, яка містить її адресі. Припустимо, є змінна типу intс ім 'ям imemorycell_contents і змінна pimemory_cell_address, що є покажчиком на неї. Як ви вже знаєте, в C/C++ є оператор узяття адреси &, яка повертає адресі свого операнда. Тому вам буде неважко розібратися в синтаксисі привласнення однієї змінної адреси іншої змінної :

pimemorycell_address = &imemorycell_contents;

Змінні, які зберігають адреси інших змінних, називаються покажчиками. На малий. 9.1 схемний свідчень взаємозв 'язок між змінною і покажчиком на неї. Змінна imemorycell_contents представлена в пам' яті комп'ютера осередком з адресою 7751. Після виконання показаного вище рядка програми адреси цієї змінної буде присвоєна покажчику pimemorycell_address.

Звернення до змінної, чия адреси зберігається в іншій змінній, здійснюється шляхом приміщення перед покажчиком оператора *: *pimemorycell_address. Такий запис означає, що буде вироблений непрямий доступ до елементу пам' яті через ім 'я покажчика, що містить адресі осередку. Наприклад, якщо виконати дві показані нижче рядки, то змінна imemorycell_contentsпримет значення 20:

pimemorycell_address = &imemorycell_contents;

****pimemorycell_address = 20; :

З урахуванням того, що покажчик pimemorycell_address зберігає адресі змінної imemorycell_contents, обидва наступні рядки приведуть до одного і тому ж результату: привласненню змінної imemorycell_contents значення 20.

imemorycell_contents = 20;

****pimemorycell_address = 20;

Оголошення покажчиків

У мовах C/C++ усі змінні мають бути заздалегідь оголошені. Оголошення покажчика pimemorycell_address виглядає таким чином:

int *pimemorycell_address;

Символ * говорити про ті, що створюється покажчик. Цей покажчик адресуватиме змінну типу int. Слід підкреслити, що в C/C++ покажчики можуть зберігати адреси тільки змінних конкретного типу. Якщо робиться спроба присвоїти покажчику одного типу адресі

змінній іншого типу, виникне помилка або під година компіляції, або в годину

виконання програми.

Розглянемо приклад:

int *pi

float real_value = 98.26;

pi = &real_value;

У даному випадку змінна pi оголошена як покажчик типу int. Але в третьому рядку робиться спроба присвоїти цьому покажчику адресі змінної real_value, що має тип float.

У результаті компілятор видасть попередження виду "несумісні операнди в операції привласнення", а програма, що використовує покажчик pi, працюватиме неправильно.

Використання покажчиків

У наступному фрагменті програми за допомогою покажчиків виробляється обмін значень між змінними iresult_a і iresult_b :

int iresialt_a = 15, iresult_b = 37, itemporary;

int *piresult; piresult = &iresult_a; itemporary = *piresult;

****piresult = iresult_b;

iresult_b = itemporary;

Перший рядок містить традиційні оголошення змінних. При цьому в пам' яті комп'ютера резервуються три комірки для зберігання цілочисельних значень, шкірному осередку привласнюється ім 'я, і дві з них ініціалізувалися початковими значеннями. Припустимо, що змінна iresult_a зберігає свої значення в осередку з адресою 5328, змінна iresult_b пов'язана з осередком 7916, a itemporary - з осередком 2385 (малий. 9.2).

У іншому рядку програми створюється покажчик piresult. При цьому також відбувається резервування іменованого елементу пам' яті (скажімо, з адресою 1920). Оскільки ініціалізація не виробляється, то в даний момент покажчик містить порожнє значення. Якщо спробувати застосувати до нього оператор *, то компілятор не повідомить про помилку, але і не поверне ніякої адреси.

Покажчики на масиви

Як вже говорилося, покажчики і масиви логічно пов' язані один з одним. Згадаєте з попередньої глави, що ім 'я масиву є константою, що містить адресі першого елементу масиву. У зв'язку з цим значення імені масиву не може бути змінене оператором привласнення або яким-небудь іншим оператором. Наприклад, нижче створюється масив типу floatс ім 'ям ftemperatures :

####define IMAXREADINGS 20

float ftemperatures[IMAXREADINGS]; float *pftemp;

У наступному рядку оголошеному вище покажчику pftemp привласнюється адреси першого елементу масиву :

pftemp = ftemperatures;

Цей же вираз можна записати таким чином:

pftemp = &ftemperatures[0];

Проте, навіть якщо покажчик описів для зберігання адреси змінних типу float, усе одне наступні вирази недопустимі:

ftemperatures = pftemp;

&&&&ftemperatures[0]= pftemp;

Ці вирази нездійснимі, оскільки в них робиться спроба змінити константу ftemperatures і еквівалентне нею вираження &ftemperatures[0], що так само безглуздо, як і рядок

10 = pftemp;

Література

  1. Катаев М.Ю. Объектно-ориентированное программирование: Учебное пособие. - Томск: Томский межвузовский центр дистанционного образования, 2000. - 145 с.

  2. Кент Рейсдорф и Кен Хендерсон BORLAND C++BUILDER. ОСВОЙ САМОСТОЯТЕЛЬНО

  3. Лафоре Р. Обьектно–ориентированное программирование в С++. 4-е изд.: – СПб: Питер, 2004 – 902 с.

  4. Львов М.С., Співаковський О.В. Вступ до об’єктно-орієнтоване програмування. Навчальний посібник. - Херсон: ХГПУ, 2000.- 238 с.:іл.

  5. М.С. Львов. О.В. СпіваковськийВступ до об’єктно-орієнтоване програмування. Навчальний посібник. - Херсон: ХГПУ, 2000.- 238 с.:іл.

  6. Шилдт Герберт. Искусство программирования на С++. Санкт-Питербург, 2005.-496 с., ил.

  7. Шилдт, Герберт. C++: руководство для начинающих, 2-е издание. : Пер. с англ. — М. : Издатель- ский дом "Вильяме", 2005. — 672 с. : ил. — Парал. тит. англ.

  8. Эккель Брюс. Философия С++. Введение в стандартный С++ (2-е издание). - СПб: Питер, 2004 – 573 с.

  9. Эккель Брюс. Философия С++. Практическое программирование (2-е издание). - СПб: Питер, 2004 – 610 с., ил.

  10. Юркова Т. А., Ушаков Д. М., Паскаль для школьников. — СПб.: Питер, 2010. — 256 с.: ил.

  11. Visual Studio 2010 и введение в .NET 4.0 и для профессионалов. Макки, Алекс : Пер. с англ. — М. : ООО И. Д. Вильямс". 2010. — 416 с. : ил. — Парал, тит. англ.