Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Samostoyatelnye_po_S.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
672 Кб
Скачать
☆

Використання вказівників в програмі

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

int a[10]

визначає масив розміру 10, тобто набір з 10 послідовних об'ектов, називаних a[0], a[1], ..., a[9]. Запис a[i] відповідає елементові масиву через i позицій від початку. Якщо pa - покажчик цілого, описаний як

int *pa

то присвоювання

pa = &a[0]

приводить до того, що pa указує на нульовий елемент масиву a; це означає, що pa містить адресу елемента a[0]. Тепер присвоювання

x = *pa

буде копіювати вміст a[0] у x. Якщо pa вказує на деякий визначений елемент масиву a, то по визначенню pa+1 указує на наступний елемент, і взагалі pa-i указує на елемент, що коштує на i позицій до елемента, що вказується pa, а pa+i на елемент, що коштує на i позицій після. Таким чином, якщо pa указує на a[0], те

*(pa+1)

посилається на вміст a[1], pa+i - адреса a[i], а *(pa+i) уміст a[i]. Ці зауваження справедливі незалежно від типу перемінних у масиві a. Очевидно, існує дуже тісна відповідність між індексацією й арифметикою покажчиків. У дійсності компілятор перетворить посилання на масив у покажчик на початок масиву. У результаті цього ім'я масиву є вказівним вираженням. Звідси випливає трохи досить корисних наслідків. Тому що ім'я масиву є синонімом місця розташування його нульового елемента, то присвоювання pa=&a[0] можна записати як

pa = a

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

Є одне розходження між ім'ям масиву і покажчиком, яких необхідно мати у виді.

Покажчик є змінною, так що операції pa=a і pa++ мають сенс. Але ім'я масиву є константою, а не перемінної: конструкції типу a=pa або a++,або p=&a будуть незаконними. Коли ім'я масиву передається функції, то насправді їй передається місце розташування початку цього масиву. Усередині викликаної функції такий аргумент є точно такий же перемінної, як і будь-яка інша, так що ім'я масиву як аргумент дійсно є покажчиком, тобто перемінної, утримуючої адрес. ми можемо використовувати цю обставину для написання нового варіанта функції strlen, що обчислює довжину рядка.

strlen(s) /* return length of string s */

char *s;

{ int n;

for (n = 0; *s != '\0'; s++)

n++;

return(n);

}

Операція збільшення s зовсім законна, оскільки ця перемінна є покажчиком; s++ ніяк не впливає на символьний рядок у звернулася до strlen функції, а тільки збільшує локальну для функції strlen копію адреси. Опису формальних параметрів у визначенні функції у виді

char s[];

char *s;

зовсім еквівалентні; який вид опису варто зволіти, визначається в значній мірі тим, які вираження будуть використані при написанні функції. Якщо функції передається ім'я масиву, то в залежності від того, що зручніше, можна думати, що функція оперує або з масивом, або з покажчиком, і діяти далі відповідним чином. Можна навіть використовувати обидва види операцій, якщо це здається доречним і ясним. Можна передати функції частина масиву, якщо задати як аргумент покажчик початку підмасива. Наприклад, якщо a - масив, те як

f(&a[2])

так і

f(a+2)

передають функції f адреса елемента a[2], тому що і &a[2], і a+2 є вказівними вираженнями, що посилаються на третій елемент a. усередині функції f опису аргументів можуть бути присутнім у виді:

f(arr)

int arr[];

{

...

}

або

f(arr)

int *arr;

{

...

}

Що стосується функції f, те той факт, що її аргумент у дійсності посилається до частини більшого масиву, не має для неї ніяких наслідків

Питання для контролю:

1. Як задати покажчик визначеного типу?

2. Як зазначити функції початок масиву?

3. Чи можна використовувати покажчик в циклі for?

Література:

1. Подбельский В.В. Язык СИ: Уч. Пособие.–5-е издание.–М.: Финансы и статистика, 2001. –560 с. ,стор 144-147

Урок №39

(згідно робочої навчальної програми)

Тема:Основні методи обробки текстових файлів.

Питання:

1.Робота з файлами

2. Відкриття файлу

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]