Дозвольте мені спробувати відповісти і на це.
Покажчики схожі на посилання. Іншими словами, це не копії, а скоріше спосіб посилання на початкове значення.
Перш за все, одне місце, де вам зазвичай доведеться багато використовувати покажчики, - це коли ви маєте справу з вбудованим обладнанням . Можливо, вам потрібно переключити стан цифрового вводу-виводу. Можливо, ви обробляєте переривання і вам потрібно зберегти значення у певному місці. Ви отримуєте картину. Однак якщо ви безпосередньо не маєте справу з обладнанням і просто цікавитеся, які типи використовувати, читайте далі.
Навіщо використовувати вказівники на відміну від звичайних змінних? Відповідь стає зрозумілішою, коли ви маєте справу зі складними типами, такими як класи, структури та масиви. Якщо ви використовували звичайну змінну, ви можете зробити копію (компілятори досить розумні, щоб запобігти цьому в деяких ситуаціях, і C ++ 11 також допомагає, але ми поки не будемо обговорювати це обговорення).
Тепер, що станеться, якщо ви хочете змінити початкове значення? Ви можете використовувати щось подібне:
MyType a; //let's ignore what MyType actually is right now.
a = modify(a);
Це буде добре, і якщо ви точно не знаєте, чому ви використовуєте покажчики, не слід їх використовувати. Остерігайтеся причини "вони, мабуть, швидші". Запустіть власні тести, і якщо вони насправді швидші, то використовуйте їх.
Однак скажімо, ви вирішуєте проблему, на яку потрібно виділити пам'ять. Коли ви виділяєте пам'ять, вам потрібно розібрати її. Розподіл пам’яті може бути або не вдалим. Тут корисні вказівники - вони дозволяють перевірити наявність виділеного вами об'єкта , і вони дозволяють отримати доступ до об'єкта, на який була виділена пам'ять, шляхом де-посилання на покажчик.
MyType *p = NULL; //empty pointer
if(p)
{
//we never reach here, because the pointer points to nothing
}
//now, let's allocate some memory
p = new MyType[50000];
if(p) //if the memory was allocated, this test will pass
{
//we can do something with our allocated array
for(size_t i=0; i!=50000; i++)
{
MyType &v = *(p+i); //get a reference to the ith object
//do something with it
//...
}
delete[] p; //we're done. de-allocate the memory
}
Це ключ до того, чому б ви використовували вказівники - посилання припускають, що елемент, на який ви посилаєтесь, вже існує . Вказівник не робить.
Інша причина, чому ви б використовували вказівники (або, принаймні, в кінцевому підсумку мали справу з ними), це те, що вони є типом даних, який існував до посилань. Тому, якщо ви в кінцевому підсумку користуєтеся бібліотеками для того, щоб зробити те, що вам відомо, що їм краще, ви виявите, що багато цих бібліотек використовують вказівники всюди, просто через те, як довго вони були (багато з них були написані перед С ++).
Якщо ви не використовували жодної бібліотеки, ви могли спроектувати свій код таким чином, щоб ви трималися подалі від покажчиків, але, враховуючи, що вказівники є одним із основних типів мови, чим швидше вам зручніше користуватися ними, тим більше портативний ваш C ++ навички.
З точки зору ремонтопридатності, я також повинен зазначити, що, коли ви використовуєте покажчики, вам або доведеться перевірити їх достовірність і обробити випадок, коли вони недійсні, або, просто припустити, що вони дійсні, і прийняти факт, що ваш програма вийде з ладу або ще гірше, коли таке припущення порушено. Інакше кажучи, ваш вибір за допомогою покажчиків полягає в тому, щоб або ввести складність коду, або більше зусиль у обслуговуванні, коли щось зламається, і ви намагаєтеся відшукати помилку, що належить до цілого класу помилок, які вводять покажчики, наприклад, пошкодження пам'яті.
Тож якщо ви керуєте всім своїм кодом, тримайтеся подалі від покажчиків і замість цього використовуйте посилання, зберігаючи їх const, коли зможете. Це змусить вас задуматися про час життя ваших об'єктів і в кінцевому підсумку дозволить легше зрозуміти ваш код.
Пам'ятайте лише про цю різницю . Посилання є по суті правильним вказівником. Вказівник не завжди дійсний.
Тож я кажу, що неможливо створити недійсну посилання? Ні. Це цілком можливо, тому що C ++ дозволяє вам робити що завгодно. Це просто важче зробити ненавмисно, і ви будете вражені тим, скільки помилок ненавмисно :)