- •Тема 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() {
Void main() {
int *p; // Визначається змінна p для запису адрес вічок
// у яких можна заносити цілі числа.
int x = 222; // Виділяє пам'ять для запису цілих чисел.
clrscr();
cout << " До ініціалізації покажчика!!!!: \n";
cout << "В адресі " << p << " міститься число *p= "
<< *p << "\n\n";
p = &x; // Ініціалізації покажчика. Покажчику привласнюємо адресу
// змінній, яка оголошена в програмі.
cout << "\n\n Після ініціалізації p= &x!!!: \n";
cout << "Адреса x = " << &x << "\n";
cout << " У покажчику p адрес= " << p << “, у якому число= “
<< *p <<" \n";
getch(); }
Схема пам'яті після оголошення змінних дана на мал. 2.
Мал. 2
Схема пам'яті після виконання коди p = &x приведена на мал. 3.
Мал. 3
Програма 4. Оголошує покажчик. Для ініціалізації покажчика використовується директива new.
void main() { int *p; // Визначається змінна p для запису адрес комірок
// у які можна заносити цілі числа.
clrscr();
cout << " Стан пам'яті до ініціалізації!!!: \n\n";
cout << "В неконтрольованій адресі " << p << " міститься випадкове число " << *p << "\n";
*p = -8; // В неконтрольовану адресу засилаємо число.
cout << "\nВ неконтрольованій адресі " << p << " міститься визначене програмою число " << *p << " \n";
cout << "Натискуй будь-яку клавишу\n";
getch();
p = new int; // Виділяється пам'ять для запису цілого числа.
cout << "В контрольованій адресі " << p << " міститься випадкове " << " число " << *p << " \n";
cout << "Натискуй будь-яку клавишу\n";
getch();
*p = -777;
cout << "\nВ контрольованій адресі " << p
<< " міститься визначене програмою число " << *p << " \n";
getch(); }
Розберемо роботу програми. Схема пам'яті після оголошення змінних дана на мал. 4.
Мал. 4
Після виконання коди p = new int комп'ютер виділяє пам'ять з адресою AN і адреса даної пам'яті заноситься в покажчик р. Стан пам'яті в цьому випадку змальовано на мал. 5.
Мал. 5
Програма 5. Оголошує покажчик. Адреса в покажчик вводиться з клавіатури директивою scanf, в якій використовується специфікація %p.
Void main()
{
int *p; // Змінна p для запису адрес вічок. int x = 2;
clrscr();
cout << " Стан пам'яті до ініціалізації!!!: \n\n";
cout << "В неконтрольованій адресі " << p << " міститься випадкове число " << *p << "\n\n";
printf("Адреса змінної x у форматі \n який визначений "
"процесором = %p",&x);
cout << "\n\n Введи адресу змінної x у форматі \n"
<< " який визначений процесором (див. попередній вивід) ";
scanf("%p",&p);
cout<<"\n\n Стан пам'яті після ініціалізації покажчика: \n\n";
printf("У змінній p адреса %p. У цій адресі число %d\n",p,*p);
getch(); }
Дана програма спочатку видасть адресу змінної x у форматі процесора. Потім в цьому ж форматі з клавіатури в покажчик p вводиться адреса змінної x. Далі після введення в p адреси x виводимо вміст змінної p (там має бути адреса x) і *p (тобто вміст x = 2).
Покажчик на покажчик – це змінна для адреси покажчика.
Загальний формат оголошення покажчика на покажчик має вигляд:
<тип> **<имя>
Наприклад, коди (директиви) int **p; float **r; виділяють дві області пам'яті p і r розміром два байти. При цьому змінна p призначена для запису адрес покажчиків типа int, а змінна r призначена для адрес покажчиків типа float. З визначення покажчика на покажчик витікає, що якщо оголошені змінні p і а як змінні типа int **p і int *a, то справедливий код p = &a. На схемі мал. 6 представлений стан пам'яті після виконання коду int **p.
Мал. 6
Тут AY, A, N – випадкові числа у відповідних областях пам'яті. Області з адресами AY і A або, що одне і те ж, з іменами *p і **p доступні, але не під контролем програми. Тому використання цих областей пам'яті при роботі програми є помилкою. Відмітимо, що справедлива тотожність AY = &*p і A = &**p.
Програма 6. Оголошує покажчик на покажчик. Видає інформацію з областей пам'яті, які доступні програмі.