Операції над покажчиками

Головна | Про нас | Зворотній зв'язок
· Додавання і віднімання покажчиків з константою;
· Віднімання одного покажчика з іншого;
Додавання і віднімання покажчиків з константою n означає, що покажчик переміщається по осередках пам'яті на стільки байт, скільки займає nпеременних того типу, на який він вказує. Припустимо, що покажчик має символьний тип і його значення дорівнює 100. Результат складання цього покажчика з одиницею - 101, так як для зберігання змінної типу char потрібно 1 байт. Якщо ж значення покажчика дорівнює 100, але він має цілочисельний тип, то результат його складання з одиницею становитиме 104, так як для змінної типу int відводиться 4 байта.
Різниця двох вказівників - це різниця їх значень, поділена на розмір типу в байтах. Так, різниця покажчиків на третій і нульовий елементи масиву дорівнює трьом, а на третій і дев'ятий - шести. Підсумовування двох покажчиків не допускається.
Інкремент переміщує покажчик до наступного елементу масиву, а декремент - до попереднього:
До вказівниками так само застосовні операції відносини ==. =, <,>,<=,>=. Іншими словами, покажчики можна порівнювати. Наприклад, якщо i вказує на п'ятий елемент масиву, а j - на перший, то ставлення i> j істинно. Крім того, будь-який покажчик можна порівнювати на рівність з нулем. Однак, всі ці твердження вірні, якщо мова йде про покажчики, що посилаються на один масив. В іншому випадку результат арифметичних операцій і операцій відносини буде не визначений.
Покажчики на покажчики.
Концепція масивів покажчиків відкрита і проста, оскільки індекси мають цілком певне значення. Проте, в разі, коли один покажчик вказує на інший, можуть виникнути проблеми. Покажчик на покажчик є формою численного перенаправлення або ланцюжка покажчиків. Розглянемо рис.
Численне перенаправлення може і далі розширюватися. Але існує небагато випадків, коли необхідно щось більш потужне, ніж покажчик на покажчик. Зайве перенаправлення призводить до концептуальних помилок, які дуже важко виправляти. (Не треба плутати численне перенаправлення зі зв'язаними списками, які використовуються в базах даних.)
Важливо розуміти, що newbalance - це не покажчик на число з плаваючою точкою, а покажчик на покажчик на дійсне число.
Для отримання доступу до цільового значення, побічно що вказується покажчиком на покажчик, слід застосувати оператор * два рази, як показано в наступному прикладі:
#include
int main (void)
int x, * p, ** q;
x = 10;
p = x;
q = p;
printf ( ".", ** q); / * Висновок значення x * /
return 0;
>
Тут p оголошується як покажчик на ціле, a q - це покажчик на покажчик на ціле. Виклик printf () виводить число 10 на екран.
Рядок - це послідовність (масив) символів (типу char), яка закінчується спеціальним символом - ознакою кінця рядка. Це символ записується як '\ 0' (не плутайте з символом розриву рядків '\ n') і дорівнює 0. При введенні рядка символ кінця рядка додається автоматично. Всі функції роботи з рядками - і стандартні, і створювані програмістом - повинні орієнтуватися на цей символ. Якщо потрібно сформувати новий рядок, то обов'язково треба додавати ознака кінця рядка. Якщо цього не зробити, то при подальшій роботі виникнуть помилки.
// Символьна константа - один символ
char * str1 = "abc", * str2 = "abc";
// Чи не відомо, чи буде виконуватися str1 == str2?
Строковим літералом називається послідовність символів, ув'язнених в подвійні лапки. У строковому літералі на один символ більше, ніж використовується при його записи - додається символ '\ 0'.
Тип строкового литерала є «масив з належним кількість константних символів». Строковий літерал можна привласнити змінної типу char *. Це дозволяється, тому що в попередніх визначеннях З Иc ++ типом строкового литерала був char *. Однак зміна строкового литерала через такий покажчик є помилкою.
char * str = "З С ++ ";
// Помилка часу виконання!
Те, що рядкові літерали є константами, не тільки є очевидним, але і дозволяє при реалізації провести значну оптимізацію методів зберігання і доступу до строкових літералів. Якщо ж потрібна рядок, яку можна модифікувати, слід оголосити і форматувати масив символів.
char str [] = "З С ++ ";
// Масив з 8 символів
// Після виходу з функції пам'ять, яка містить рядок, не буде звільнена
Нормативний тип даних.
До теперішнього моменту ми припускали, що структури даних і їх розміщення в просторі пам'яті строго фіксоване і не змінився, тобто статично. Тому, такі дані, як правило, називають статичними. При цьому, слід зауважити, що доступ до статичних даних завжди здійснюється безпосередньо до місця їх фізичного розміщення в пам'яті, тобто, використовується механізм безпосереднього доступу до даних.
Як механізм непрямого доступу до даних, Ада пропонує концепцію посилальних типів, використання яких багато в чому подібно до традиційного використання покажчиків. При цьому посилальні типи Ади володіють наступними характерними особливостями:
· Значення посилального типу можуть посилатися тільки на значення того типу, який був зазначений при описі посилального типу.
З цього випливає, що використання довідкових типів Ади більш безпечно і підвищує загальну надійність створюваного програмного забезпечення.
Примітно, що в літературі не рідко зустрічаються випадки коли офіційна термінологія порушується і посилальні типи Ади називають покажчиками. Як правило, це робиться з метою забезпечити більш традиційне виклад матеріалу.
Всі описи посилальних типів Ади можна умовно розділити на три види:
· Посилальні типи для динамічної пам'яті
· Узагальнені посилальні типи
· Посилальні типи для підпрограм