Вказівні вирази

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

Присвоєння покажчиків

Вказівник можна використовувати в правій частині оператора присвоєння для надання його значення іншому покажчику. Якщо обидва покажчики мають той самий тип, то виконується просте присвоєння, без перетворення типу. У наступному прикладі

обидва покажчики (p1 і р2) посилаються на х. Тобто, обидва покажчики посилаються на той самий об'єкт. Програма виводить на екран наступне:

Допускається надання покажчика одного типу покажчику іншого типу. Однак для цього необхідно виконати явне перетворення типу покажчика (операція наведення типів), що розглядається в наступному розділі.

Перетворення типу покажчика

передасть змінної y лише 4 байти інформації, а не 8 байтів, необхідних для double . Незважаючи на те, що p посилається на об'єкт double, оператор присвоєння виконає дію з об'єктом типу int, тому що p оголошено як покажчик на int. Тому таке використання покажчика неправильне.

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

На заміткуУ мові C++ потрібно явно вказувати перетворення типу покажчиків, зокрема покажчиківтипу void *. Тому багато програмістів використовують у мові З явне перетворення сумісності з C++.

Адресна арифметика

У мові С допустимі лише дві арифметичні операції над покажчиками: підсумовування та віднімання. Припустимо, поточне значення покажчика p1 типу int * дорівнює 2000. Припустимо також, що змінна типу int займає у пам'яті 2 байти. Тоді після операції збільшення

покажчик p1 приймає значення 2002, а чи не 2001. Тобто, зі збільшенням на 1 покажчик p1 посилатиметься наступне ціле число. Це справедливо й у операції зменшення. Наприклад, якщо p1 дорівнює 2000, після виконання оператора

значення p1 дорівнюватиме 1998.

Мал. 5.2. Приклад розміщення в пам'яті змінних char (ліворуч) та int (праворуч)

Порівняння покажчиків

Стандартом З допускається порівняння двох покажчиків. Наприклад, якщо оголошено два покажчики р і q, то наступний оператор є правильним:

Як правило, порівняння покажчиків може виявитися корисним тільки тоді, коли два покажчики посилаються на загальний об'єкт, наприклад, на масив. Як приклад розглянемо програму з двома стековими функціями, призначеними для запису та зчитування цілих чисел. Стек - це список, що використовує систему доступу "першим увійшов - останнім вийшов". Іноді стек порівнюють зі чаркою тарілок на столі: перша, поставлена ​​на стіл, буде взята останньою. Стеки часто використовуються в компіляторах, інтерпретаторах, програмах обробки великоформатних таблиць та інших системних програмах. Для створення стека необхідні дві функції: push() та pop(). Функція push() заносить числа в стек, a pop() - витягує їх. У цьому прикладі ці функції використовуються в main() . При введенні числа з клавіатури програма поміщає його в стек.Якщо ввести 0, то кількість витягується зі стека. Програма завершує роботу під час введення -1.

В операторі return функції pop() дужки необхідні тому, що без них оператор