Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

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






Вказівники і масиви






Будь-яку операцію, яку можна виконати за допомогою індексів масиву, можна виконати і за допомогою вказівників. Варіант із вказівниками більш швидкий, але й більш складний для розуміння. Опис

int a[10];

визначає масив розміром 10, тобто набір з 10 послідовних об’єктів a[0], a [1],..., a [9]. Запис a [i] відповідає елементу масиву через i позицій від початку. Якщо ра – вказівник цілого, описаний як int *pa, то присвоєння pa = & a [0] означає, що pa вказує на нульовий елемент масиву a, тобто ра містить адресу елемента a [0]. Присвоєння x = * pa буде копіювати вміст a [0] у x. Якщо pa вказує на деякий певний елемент масиву a, то pa + 1 вказує на наступний елемент. Взагалі pa-і вказує на елемент, який розміщено на i позицій до елемента, що вказується pa, а pa + i на елемент, розміщений на i позицій після елемента. Отже, якщо ра вказує на а [0], то *(ра + 1) посилається на вміст а [1], ра + і – адреса а [ і ], а *(ра + і) – вміст а [ і ]. Ці зауваження справедливі незалежно від типу змінних у масиві a.

Очевидно існує дуже тісна відповідність між індексацією і арифметикою вказівників. Насправді компілятор перетворить посилання на масив у вказівник на початок масиву. В результаті цього ім’я масиву є вказівником виразу, тобто ім’я масиву є синонімом місця розташування його нульового елемента. Тому pa = & a [0] можна записати як pa = a.

Посилання на a [ i ] можна записати у вигляді *(a + i), тобто ці дві форми еквівалентні. Якщо застосувати операцію & до обох частин такого співвідношення еквівалентності, то & a [ i ] і a+i теж будуть ідентичними: a+i – адреса i -го елемент від початку a. Проте, якщо pa є вказівником, то у виразах його можна використати з індексом pa [ i ], що ідентично *(pa+i). Отже, будь-який вираз, який містить масиви й індекси, можна записати через вказівники та зсуви і навпаки.

Слід мати на увазі, що вказівник є змінною, тому операції pa = a і pa ++ мають сенс. Але ім’я масиву є константою, а не змінною,
тому конструкції типу a = pa або a ++, або p = & a будуть помилковими.

Коли ім’я масиву передається функції, то насправді їй передається місце розташування початку цього масиву. Отже ім’я масиву як аргумент дійсно є вказівником, тобто змінною, яка містить адресу. Розглянемо функцію StrLen (див. ПП6.4 на СD), яка обчислює довжину рядка, де описи формальних параметрів

char s[];

char *s;

еквівалентні, і який вид опису варто використати, визначається тим, які вирази будуть використані для написання функції.

Можна передати функції частину масиву, якщо задати як аргумент вказівник початку підмасиву. Наприклад, якщо a – масив, то як F (& a [2]), так і F (a +2) передають функції F адресу елемента a [2], оскільки і & a [2], і a +2 є вказівними виразами, що посилаються на третій елемент a.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.005 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал