- •Тема 13: Покажчики. Зв'язок покажчика з масивами. Динамічна пам'ять
- •1. Покажчики
- •У змінній p міститься випадкова адреса: 0xNnnnnnnn
- •Void main()
- •2. Способи ініціалізації покажчиків
- •Void main() {
- •Void main()
- •Void main()
- •3. Зв'язок покажчика з одновимірним масивом
- •Void main() {
- •4. Двовимірний масив
- •Void main()
- •5. Динамічна пам'ять
- •Void main()
- •Void main()
- •Void main()
- •Void main() {
Тема 13: Покажчики. Зв'язок покажчика з масивами. Динамічна пам'ять
План
1. Покажчики.
2. Способи ініціалізації покажчиків.
3. Зв’язок покажчика з одновимірним масивом.
4. Двувимірний масив.
5. Динамічна пам’ять.
1. Покажчики
Покажчик – це змінна для адреси елементу пам'яті. Загальний формат оголошення покажчика має вигляд:
<тип> *<имя>
Наприклад, коди (директиви) int *p; float *r; виділяють дві області пам'яті p і r розміром два байти. При цьому змінна p призначена для запису адрес змінних типа int, а змінна r призначена для адрес змінних типа float.
Програма 1. Оголошує покажчик. Видає випадкову інформацію з області пам'яті, яка виділяється під покажчик.
void main()
{ int *p; // Визначається змінна p, яка є покажчиком.
clrscr ();
cout << "В змінній p міститься випадкова адреса: “
<< p << “\n”;
getch(); }
Після виконання цієї програми на екрані видачі результатів з'явиться наступне повідомлення:
У змінній p міститься випадкова адреса: 0xNnnnnnnn
При оголошенні покажчика, наприклад int *p, виділяється пам'ять розміром два байти, в яких і знаходиться випадкове число A. Це число комп'ютер інтерпретує як адреса пам'яті для запису цілого числа. Число з адреси A, яка записана в покажчику, доступно для комп'ютера. Отже, при оголошенні покажчика користувачеві доступні дві області пам'яті. Перша область відводиться під покажчик. Ця область пам'яті має ім'я р. Друга область визначається адресою, яка зберігається в покажчику. Ім'я
другої області пам'яті – *p. Причому адреса змінної *p рівний A, тобто справедлива тотожність &(*p)=A.
Зауваження 1. Використовувати покажчик, який не ініціалізувався (не задається) програмою, не можна!!!
Доступ до інформації з адрес, які зберігаються в покажчиках типа int *p, float *r і т. д., реалізується, наприклад, директивами:
*p = 6 – в елемент пам'яті, адреса якої зберігається в покажчику p, заслати число 6;
cout << *p – видати на екран інформацію з елементу пам'яті, адреса якої зберігається в покажчику р.
Схема пам'яті до і після виконання коди *p = 6 дана на мал. 1.
мал. 1
Для видачі покажчика на екран або для введення його з клавіатури використовується формат %p.
Програма 2. Оголошує покажчик. Видає інформацію з областей пам'яті p і *p, які доступні програмі.
Void main()
{ int *p;
clrscr();
printf("У змінній p міститься не контрольований програмою ” “адрес:\n %p" " – шістнадцятиричний запис адреси у форматі \n"
" який визначає процесор. \n\n",p);
printf("У змінній p міститься не контрольований програмою “ “адрес:\n %ld" " – десятковий запис адреси. \n\n", p);
printf("У адресі %p міститься випадкове число %d ", p *p); *p = 10; . printf("\n\nВ адресі %p міститься число %d,"
" яке визначається програмою. \n", p *p); getch(); }
Після закінчення роботи даної програми на екрані монітора з'явиться вміст змінних p *p до ініціалізації *p і після її ініціалізації, тобто після виконання коди *p = 10.
2. Способи ініціалізації покажчиків
Покажчику можна привласнити адресу однотипної змінної, яка оголошена в програмі. Наприклад, після виконання директив
int *p, x;
p = &x;
у змінну p засилає адреса змінної x.
Покажчику можна привласнити значення NULL як ознаку непідготовленості покажчика.
Покажчик можна ініціалізувати, використовуючи директиву new. Наприклад, директива p = new int, де p – покажчик, виділяє пам'ять для запису цілого числа. Адреса цієї області пам'яті заноситься в покажчик p і дана пам'ять ставиться під контроль програми.
У покажчик можна вводити інформацію з клавіатури, використовуючи директиву введення формату scanf() із специфікацією %p.
Програма 3. Оголошує покажчик. Покажчику привласнюється адреса однотипної змінної.