Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / 3_кол / Лекції / лекция_C++ (13_1) у.doc
Скачиваний:
10
Добавлен:
30.05.2020
Размер:
349.18 Кб
Скачать

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. Оголошує покажчик на покажчик. Видає інформацію з областей пам'яті, які доступні програмі.

Соседние файлы в папке Лекції