Давайте розглянемо процес оголошення вказівників. Комп'ютеру потрібно відстежувати тип значення, на яке посилається вказівник. Наприклад, адреса char зазвичай виглядає точно так само, як і адреса double, але char і double використовує різну кількість байт і різний внутрішній формат представлення значень. Тому оголошення вказівника повинно задавати тип даних значення, що вказується. Наприклад, попередній приклад містить таке оголошення:
Цей оператор встановлює, що комбінація *p_updates має тип int.
Оскільки ви використовуєте операцію *, застосовуючи її до вказівника, сама змінна p_updates має бути вказівником. Ми говоримо, що p_update вказує на тип int. Ми також говоримо, що тип p_updates - це вказівник на int, або точніше, int*. Отже, повторимо ще раз: p_updates - це вказівник (адреса), a *p_updates - це int, а не вказівник (мал. 8). Пробіли навколо операції * не обов'язкові.
Мал. 8. Вказівники зберігають адреси
Традиційно програмісти на С використовують наступну форму:
Це підкреслює ідею, що комбінація *ptr є значенням типу int. З іншого боку, багато програмістів на C++ віддають перевагу такій формі:
Це підкреслює ідею про те, що int* - це тип "вказівник на int". Для компілятора неважливо, з якого боку ви поставите пробіл. Можна навіть записати так:
Однак врахуйте, що таке оголошення створює один вказівник (р1) і одну звичайну змінну типу int (p2):
Знак * повинен бути розміщений біля кожної змінної типу вказівника.
Такий самий синтаксис застосовується для оголошення вказівників на інші типи:
Оскільки ви оголошуєте tax_ptr як вказівник на double, компілятор знає, що *tax_ptr - це значення типу double. Toбто йому відомо, що *tax_ptr представляє число, збережене у форматі з плаваючою точкою і займає (в більшості систем) 8 байт. Змінна вказівника ніколи не буває просто вказівником. Вона завжди вказує на певний тип. tax_ptr має тип "вказівник на double" (або тип double*), a str - це тип "вказівник на char" (або тип char*). Хоча обидва вони є вказівниками, але вказують вони на значення двох різних типів. Подібно до масивів, вказівники базуються на інших типах.
Зверніть увагу, що в той час як tax_ptr і str вказують на типи даних двох різних розмірів, самі змінні tax_ptr і str зазвичай мають однаковий розмір. Тобто адреса char має той же розмір, що й адреса double - точно так само, як 1016 може бути номером будинку, в якому розташовується величезний склад, в той час як 1024 - номером невеликого котеджу. Розмір або значення адреси насправді нічого не говорять про те, якого виду та розміру змінна або будова знаходиться за цією адресою. Зазвичай адреса вимагає від 2 до 4 байт, залежно від комп'ютерної системи. (У деяких системах можуть застосовуватися і довші адреси, а іноді система використовує різний розмір адрес для різних типів.)
Ініціалізувати вакзівник можна в операторі оголошення. У цьому випадку ініціалізується вказівник, а не значення, на яке він вказує. Тобто наступні оператори встановлюють pt, а не *pt рівним значенню &higgens:
У лістингу 14 демонструється ініціалізація вказівника певною адресою:
Приклад виконання програми:
Як бачите, програма ініціалізує pt, а не *pt, адресою змінної higgens. (Швидше за все, ви отримаєте в своїй системі інше значення адреси і, можливо, відображене в іншому форматі.)