Моя дуже особиста думка полягає в тому, що малюнки зі стрілками, що вказують таким чином або роблять вказівники важче зрозуміти. Це робить їх схожими на якісь абстрактні, загадкові сутності. Вони не.
Як і все на вашому комп’ютері, покажчики - це цифри . Назва "покажчик" - це просто фантазійний спосіб сказати "змінну, що містить адресу".
Тому дозвольте мені порушити речі, пояснивши, як насправді працює комп'ютер.
У нас є int
, він має ім'я i
та значення 5. Це зберігається в пам'яті. Як і все, що зберігається в пам'яті, йому потрібна адреса, інакше ми не зможемо її знайти. Скажімо, він i
закінчується за адресою 0x12345678, а його товариш j
зі значенням 6 закінчується відразу після нього. Якщо припустити 32-розрядний процесор, де int - 4 байти, а покажчики - 4 байти, то змінні зберігаються у фізичній пам'яті так:
Address Data Meaning
0x12345678 00 00 00 05 // The variable i
0x1234567C 00 00 00 06 // The variable j
Тепер ми хочемо вказати на ці змінні. Ми створюємо один вказівник на int int* ip1
, і один int* ip2
. Як і все в комп'ютері, ці змінні вказівника також виділяються десь у пам'яті. Давайте припустимо, що вони опиняються на наступних суміжних адресах пам'яті, одразу після цього j
. Встановлюємо покажчики, які містять адреси виділених раніше змінних: ip1=&i;
("скопіюйте адресу i в ip1") і ip2=&j
. Що відбувається між рядками:
Address Data Meaning
0x12345680 12 34 56 78 // The variable ip1(equal to address of i)
0x12345684 12 34 56 7C // The variable ip2(equal to address of j)
Отже, ми отримали лише кілька байтових фрагментів пам'яті, що містять числа. Містічних чи магічних стрілок ніде не видно.
Насправді, лише переглянувши дамп пам'яті, ми не можемо сказати, чи містить адреса 0x12345680 int
або int*
. Різниця полягає в тому, як наша програма вирішує використовувати вміст, збережений за цією адресою. (Завдання нашої програми насправді просто сказати процесору, що робити з цими номерами.)
Тоді ми додамо ще один рівень непрямості за допомогою int** ipp = &ip1;
. Знову ми просто отримуємо шматок пам’яті:
Address Data Meaning
0x12345688 12 34 56 80 // The variable ipp
Шаблон здається знайомим. Ще один фрагмент у 4 байти, що містить число.
Тепер, якби у нас був дамп пам'яті вищенаведеної вигаданої невеликої ОЗУ, ми могли б вручну перевірити, куди ці вказівки вказують. Ми заглядаємо, що зберігається за адресою ipp
змінної, і знаходимо вміст 0x12345680. Звичайно, це адреса, де ip1
зберігається. Ми можемо зайти на цю адресу, перевірити вміст там і знайти адресу i
, і, нарешті, ми можемо перейти до цієї адреси і знайти номер 5.
Отже, якщо ми візьмемо вміст ipp *ipp
, ми отримаємо адресу змінної вказівника ip1
. Написавши, *ipp=ip2
ми копіюємо ip2 в ip1, він еквівалентний ip1=ip2
. В будь-якому випадку ми отримаємо
Address Data Meaning
0x12345680 12 34 56 7C // The variable ip1
0x12345684 12 34 56 7C // The variable ip2
(Ці приклади були наведені для великого ендіанського процесора)
ipp
коли визначатимете його, щоб ваше запитання було повним ;-)