Існує кілька труднощів з покажчиками:
- Збудження Можливість зміни значення об'єкта за допомогою різних імен / змінних.
- Не місцевість Можливість змінити значення об'єктів у контексті, відмінному від того, в якому він оголошений (це також відбувається з аргументами, переданими посиланням).
- Невідповідність життя Термін служби вказівника може відрізнятися від терміну експлуатації об'єкта, на який він вказує, і це може призвести до недійсних посилань (SEGFAULTS) або сміття.
- Арифметика вказівника . Деякі мови програмування дозволяють маніпулювати покажчиками як цілі числа, а це означає, що вказівники можуть вказувати куди завгодно (включаючи найнесподіваніші місця, коли є помилка). Щоб правильно використовувати арифметику вказівника, програміст повинен знати про розміри пам’яті об’єктів, на які вказували, і це щось більше, про що слід подумати.
- Тип Casts Можливість передавати покажчик від одного типу до іншого дозволяє перезаписати пам'ять об'єкта, відмінного від призначеного.
Тому програміст повинен продумати більш ретельно, використовуючи покажчики (я не знаю про два рівні абстракції ). Це приклад типових помилок, допущених новачком:
Pair* make_pair(int a, int b)
{
Pair p;
p.a = a;
p.b = b;
return &p;
}
Зауважте, що такий код, як зазначено вище, цілком розумний для мов, які не мають поняття покажчиків, а скоріше одного з імен (посилань), об'єктів та значень, як функціональних мов програмування, і мов зі збиранням сміття (Java, Python). .
Труднощі з рекурсивними функціями трапляються, коли люди, які не мають достатнього математичного досвіду (де рекурсивність є загальним і потрібним знанням), намагаються підійти до них, думаючи, що функція буде вести себе по-різному, залежно від того, скільки разів вона була викликана раніше . Ця проблема посилюється через те, що рекурсивні функції справді можна створити таким чином, щоб ви мали думати саме так, щоб їх зрозуміти.
Подумайте про рекурсивні функції з передачею вказівників, як у процедурному виконанні Червоно-Чорного дерева, в якому структура даних змінюється на місці; це щось складніше думати, ніж функціональний аналог .
Про це не йдеться, але інше важливе питання, з яким у новачків виникають труднощі, - це паралельність .
Як уже згадували інші, існує додаткова неконцептуальна проблема з деякими конструкціями мови програмування: це те, що навіть якщо ми розуміємо, прості та чесні помилки з цими конструкціями можуть бути надзвичайно важкими для налагодження.