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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



У мові "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. Відкриття файлу

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

Під час роботи програма може обмінюватися даними з будь-якими зовнішніми пристроями: клавіатурою, монітором, жорстким диском і т. д. Для такого обміну даними використовується поняття файл

Файл - це інформація, розміщена на якомусь носії (диску) або в буфері вводу / виводу пристрою (клавіатура). Для обміну даними файл повинен бути відкритий, по завершенні цього процесу - закритий.

Потік - це логічний канал, призначений для виконання операцій введення / виводу. Кожному файлу при його відкритті ставиться у відповідність потік.

У мові C існують стандартні потоки:

stdin - стандартний консольне введення (клавіатура за замовчуванням);

stdout - стандартний консольний вивід (монітор за умовчанням);

Стандартні потоки відкриваються при кожному запуску програми.

Для роботи з файлами в програмах на C використовується заголовний файл stdio.h, в якому оголошено спеціальний тип даних - структура FILE, призначена для зберігання атрибутів (параметрів) файлів (покажчик поточної позиції файлу, ознака кінця файла, прапори індикації помилок, відомості про буферизації та ін.)

Поля структури типу FILE доступні за допомогою спеціальних

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

Оголошення потоку - змінної-покажчика на структуру типу FILE, в якій зберігатимуться атрибути файлу

FILE * fl,

де * fl - покажчик на файл.

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

fl = fopen ("шлях до файлу", "режим роботи файлу");

Параметр "шлях до файлу" вказує розміщення файлу на диску і обов'язково містить ім'я файлу і може містити ім'я логічного диска і шлях.

Параметр "режим роботи файлу" показує, як буде використовуватися файл:

"W" - для запису даних (висновок);

"R" - для читання даних (введення);

"A" - для додавання даних до існуючих записів.

Приклади відкриття файлів:

FILE * f_in, * _out;

f_in = fopen ("My_file1", "r");

f_out = fopen ("My_file2", "w");

Функція fopen () повертає значення покажчика на структуру типу файл. Якщо файл з якихось причин не відкривається, функція fopen () повертає значення NULL.

Розглянемо особливості режимів відкриття файлів. Якщо файл відкривається в режимі запису даних "w", то покажчик поточної позиції встановлюється на початок файла. Якщо зазначений у функції fopen () файл не існує, то він створюється. Необхідно пам'ятати, що відкриття існуючого файлу в режимі "w" призводить до знищення його старого змісту.

Відкриття файлу для читання в режимі "r" можливо тільки для створеного раніше файлу, при цьому покажчик поточної позиції встановлюється на початок файла. Якщо відкривається на читання файл не існує, функція fopen () повертає порожній покажчик зі значенням NULL.

Якщо файл відкривається в режимі додавання даних "a", то покажчик поточної позиції встановлюється на кінець файлу. Дані, раніше поміщені у файл, залишаються без змін. Якщо вказується неіснуючий файл, то він створюється заново. Також можна вказати додаткові умови режиму відкриття файлу:

"B" - двійковий потік;

"T" - текстовий потік;

"+" - Оновлення файлу.

Приклад

"R +" - читання файлу з оновленням, тобто можлива перезапис даних з усіканням;

"W +" - запис у файл і одночасно читання;

"A +" - додавання даних і читання.

Для почергового виконання читання і запису в режимі "+" необхідно ручне позиціонування курсору.

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

1.Що таке файл?

2.Що таке потік?

3. Як відкрити файл?

4. Які є режими відкриття файлу?

Література:

1. 1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704с. –с. 284-301

 

Урок №40

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

 

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

Питання:

1. Обробка відкритого файлу

2. Перевірка ознаки кінця файлу

3. Закриття файлу

Обробка відкритого файлу

Яким чином можна прочитати вже відкритий файл або записати в нього інформацію? Для цього в мові C існують спеціальні функції:

Читання (введення) Запис (виведення)

getc () putc ()

fscanf () fprintf ()

fgets () fputs ()

fread () fwrite ()

При кожній операції введення / виводу покажчик поточної позиції файлу зміщується на одну позицію в сторону кінця файлу.



Поделиться:


Последнее изменение этой страницы: 2016-08-10; просмотров: 257; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.212.145 (0.028 с.)