русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Покажчики й адреси


Дата додавання: 2014-11-28; переглядів: 936.


Почнімо зі спрощеного зображення того як організовано пам'ять. Типова машина має масив послідовно нумерованих або адресованих комірок (секцій) пам'яті, якими можна орудувати окремо або прилеглими групами. Поширеним випадком є, коли один байт може бути char, тоді як пара однобайтових комірок розглядається як коротке ціле (short int), а чотири суміжних байти утворюють довге ціле. Покажчик — це група комірок (часто дві або чотири), що можуть утримати адресу. Тож, якщо c — це char, а p — це покажчик, що вказує на адресу c, то ми можемо графічно зобразити цю ситуацію як наступне:

.---------------------.

| |

p: | c: V

------+---+---+---+---------+---+---+---+---+------

|:::|:::|:::| |:::|:::|:::|:::|

|:::|:::|:::| |:::|:::|:::|:::|

------+---+---+---+---------+---+---+---+---+------

Унарний оператор & добуває адресу об'єкта, тож твердження

p = &c;

присвоює адресу c змінній p, і p, як говорять, «вказує на» c. Оператор & застосовується лише з об'єктами з пам'яті — змінними й елементами масивів. Його неможливо використати з виразами, константами або регістровими змінними.

Унарний * є оператором непрямого звертання або «розіменування». Коли його застосовано до покажчика, він дає доступ до об'єкта, на який вказує покажчик. Припустімо, що x та y є цілими, а ip — це покажчик на int. Наступний штучний приклад демонструє як оголосити покажчик і як користуватися & та *:

int x = 1, y = 2, z[10];

int *ip; /* ip є покажчиком на int */

 

ip = &x; /* ip тепер вказує на x */

y = *ip; /* y дорівнює тепер 1 */

*ip = 0; /* x дорівнює тепер 0 */

ip = &z[0]; /* ip тепер вказує на z[0] */

Оголошення змінних x, y та z нам зрозуміле. Оголошення ж покажчика ip

int *ip;

задумане як мнемоніка (як символічне); воно вказує на те, що вираз *ip є типу int. Синтаксис оголошення змінної імітує синтаксис виразів, в яких змінна може з'явитися. Ця сама система застосовується також при оголошенні функцій. Наприклад,

double *dp, atof(char *);

вказує на те, що вирази *dp і atof(s) повернуть значення типу double і, що аргументом atofявляється покажчик на char.

Ви також повинні звернути увагу на те, що покажчик обмежений вказувати тільки на окремий рід об'єктів: кожний покажчик вказує на певний тип даних. (Існує один виняток — «покажчик наvoid» (порожній покажчик), використовуваний для утримування будь-якого типу покажчиків, але до якого неможливо непрямо звернутися. Ми повернемося до нього у Розділі 5.11.)

Якщо ip вказує на ціле x, тоді *ip може з'являтися в будь-якому контексті, в якому може x, тож

*ip = *ip + 10;

збільшує *ip на 10.

Унарні оператори * та & прив'язані тісніше ніж арифметичні оператори, тож присвоєння

y = *ip + 1;

візьме те, на що вказує ip, додасть 1 і присвоїть отриманий результат y, тоді як

*ip += 1;

здійснює приріст того, на що вказує ip; те саме стосується

++*ip;

та

(*ip)++;

В останньому прикладі, дужки обов'язкові; без них, вираз збільшив би саму ip (тобто адресу) амість того, на що вона вказує, оскільки унарні оператори такі як * й ++ асоціюються (спрягаються) зправа наліво.

І, нарешті, оскільки покажчики, це також змінні, їх можна виживати без непрямого звертання. Наприклад, якщо iq — це інший покажчик на int, то

iq = ip;

копіює вміст ip до iq, таким чином примушуючи iq вказувати на той самий об'єкт, на який вказує ip.


<== попередня лекція | наступна лекція ==>
Обумовлене включення файлів | Покажчики й аргументи функцій


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн