Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Оголошення та ініціалізація вказівників



Давайте розглянемо процес оголошення вказівників. Комп'ютеру потрібно відстежувати тип значення, на яке посилається вказівник. Наприклад, адреса 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. (Швидше за все, ви отримаєте в своїй системі інше значення адреси і, можливо, відображене в іншому форматі.)




©2015 studopedya.ru Все права принадлежат авторам размещенных материалов.