Дороговкази в сі
Е то, мабуть, найскладніша і найважливіша тема в усьому курсі. Без розуміння покажчиків подальше вивчення сі буде безглуздим. Покажчики - дуже проста концепція, дуже логічна, але вимагає уваги до деталей.
Розглянемо код уважно, ще раз
Створили покажчик типу int.
Після цього значення A також змінено, так як вона вказує на ту ж область пам'яті. Нічого складного.
Тепер інший важливий приклад
Масив, по суті, сам є покажчиком, тому не потрібно використовувати оператор . Ми можемо переписати приклад по-іншому
Якщо ж покажчики рівні, то вони вказують на одну і ту ж область пам'яті.
Очевидно, ніщо не заважає створити і покажчик на покажчик на покажчик, і покажчик на покажчик на покажчик на покажчик і так далі. Це нам знадобиться при роботі з двовимірними і багатовимірними масивами. А ось простий приклад, як можна працювати з покажчиком на покажчик.
За стандартом гарантовано, що в цьому випадку покажчик дорівнює NULL. і дорівнює нулю, і може бути використаний як логічне значення false. Хоча в залежності від реалізації NULL може і не бути рівним 0 (в сенсі, не дорівнює нулю в побітового поданні, як наприклад, int або float).
Це означає, що в даному випадку
цілком коректна операція, а в разі
поведінка не визначено. Тобто покажчик можна порівнювати з нулем, або з NULL. але не можна NULL порівнювати зі змінною цілого типу або типу з плаваючою крапкою.
Тепер кілька прикладів роботи з покажчиками
1. Пройдемо по масиву і знайдемо всі парні елементи.
2. Коли ми сортуємо елементи часто доводиться їх переміщати. Якщо об'єкт займає багато місця, то операція обміну місцями двох елементів буде дорогим. Замість цього можна створити масив покажчиків на вихідні елементи і впорядкувати його. Так як розмір покажчиків менше, ніж розмір елементів цільового масиву, то і сортування відбуватиметься швидше. Крім того, маса не буде змінений, часто це важливо.
3. Більш цікавий приклад. Так як розмір типу char завжди дорівнює 1 байт, то з його допомогою можна реалізувати операцію swap - обміну місцями вмісту двох змінних.
У цьому прикладі можна поміняти тип змінних a і b на double або будь-який інший (з відповідною зміною виведення і виклику sizeof), все одно ми будемо обмінювати місцями байти двох змінних.
4. Знайдемо довжину рядка, введеної користувачем, використовуючи покажчик
Зверніть увагу на ділянку коду
його можна переписати
або, прибравши інкремент в умова
ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 [email protected] Stepan Sypachev students