Навіщо потрібні покажчики в мові Сі

Навіщо потрібні покажчики в мові Сі?

У блозі вже є урок, що розповідає про покажчики. У тому уроці я спробував докладно пояснити, що таке покажчик і як з ним можна працювати. Але забув найголовніше, то з чого варто було б почати. І вдумливі Новомосковсктелі швидко помітили цей мій недолік, і стали задавати логічні запитання: «А навіщо це все? Навіщо потрібні покажчики? Чому нам не працюється зі змінними? Нормально ж сталось усе, ну чого ти почав щось? А? »

І правда, чого я почав щось? Пора розставити крапки над i. Отже, нижче кілька варіантів відповіді на питання: «Навіщо в Сі потрібні покажчики?»

Відповідь номер один.

Правила мови Сі такі, що без використання покажчиків деякі речі неможливо реалізувати.

Розумні слова добре, а наочний приклад ще краще.

Нагадую, що в мові Сі змінні в функцію передаються «за значенням». Це означає, що коли ми викликаємо функцію з якимись параметрами, то в пам'яті створюються копії цих змінних і вже з ними працює функція. Коли функція закінчує свою роботу, ці копії знищуються.

І чим це нам заважає?

Ну, в принципі, тим, що ми не можемо написати функцію, яка змінює значення двох змінних місцями. В принципі, я вже говорив про цю проблему і навіть приводив її рішення, але якось не акцентував уваги на те, що без покажчиків написати таку функцію неможливо. Але щоб все було в одному місці, коротко повторюся.

На перший погляд здається, що все в порядку, але запустивши таку програму, легко переконатися, що написана нами функція працює не так, як ми очікуємо.

void swap (int a, int b)

Навіщо потрібні покажчики в мові Сі

void swap (int * pi_a, int * pi_b)

// приймаємо покажчики на змінні типу int

// так як функція swap приймає покажчики

Результат роботи програми з використання покажчиків:

Навіщо потрібні покажчики в мові Сі

Як бачите, тепер функція працює так, як він неї потрібно.

Відповідь номер два.

Покажчики дозволяє ефективно використовувати можливості і ресурси комп'ютера.

Хоча відповідь і інший, а причина все та ж. Передача аргументів на функцію. Я вже говорив вище, в функцію передаються копії змінних. Це правило не стосується масивів. Масиви завжди передаються «по посиланню». Саме це і дозволяє ефективно використовувати ресурси і можливості комп'ютера.

Уявіть, що ви б передавали масив з 10000 значень типу double за значенням. Тобто, при виконанні функції програмі потрібно було б знайти достатньо місця, щоб зберегти такий обсяг даних. Причому місця безперервного, так як масиви, як ви повинні пам'ятати, розташовуються в пам'яті послідовно. І, крім того, необхідно було б скопіювати всі елементи з одного масиву в інший.

Такий підхід займав би багато часу і пам'яті, та й взагалі, був би неможливий при великих масивах. А так, ми передали покажчик на перший елемент і радіємо. І не потрібно багато пам'яті шукати, і копіювати нічого не доводиться.

Третя відповідь.

Використання покажчиків дозволяє писати ефективні програми.

Поки що повірте на слово. Я знаю один показовий приклад, який додам сюди трохи пізніше.

Четвертий відповідь.

Це відповідь швидше відноситься до питання: «Навіщо вам потрібно знати покажчики?», А не до початкового питання: «Навіщо покажчики потрібні в Сі, в принципі?».

Відповідь банальна і очевидний.

Мова Сі влаштований таким чином, що, не знаючи принципів роботи з покажчиками, ви просто не зможете використовувати величезну кількість його можливостей.

Приклад привести дуже легко. Відкрийте довідник по функціям роботи з рядками в Сі і уважно подивіться, що повертають ці функції. Величезна їх кількість повертають в якості результат своєї роботи покажчики. А якщо ви про них нічого не знаєте, як ви зможете їх використовувати? Та ніяк.

Ось і все на сьогодні.

Завантажити текстову версію уроку. [Pdf]