- •Елементи мови с.Основні символи
- •Ключові слова
- •Ідентифікатори
- •Константи
- •Лексеми
- •Коментарі
- •Умовні оператори. Логічні вирази
- •Форми оператора if
- •Оператор вибору switch
- •Перерахування типів
- •Перетворення типів
- •Оператори циклу
- •Оператор while
- •Оператор for
- •Оператор do-while
- •Оператори переходу
- •Cтруктури
- •Об'єднання (суміші)
- •Робота з структурами.
- •Ініціалізація структур
- •Робота з обєднаннями
- •Визначення об'єктів та типів
- •Методи доступу до елементів масивів
- •Покажчики на багатовимірні масиви
- •Операції з вказівниками
- •Робота з покажчиками.
- •Покажчики на структуру
- •Масиви структур
- •Динамічне розміщення масивів
- •Робота з динамічними масивами
- •Робота з непрямою адресацією
- •Робота з покажчиками як параметрами функцій
- •Використання вказівників
- •Операції з вказівниками
- •Використання вказівників в програмі
- •Робота з файлами
- •Відкриття файлу
- •Обробка відкритого файлу
- •Перевірка ознаки кінця файлу
- •Закриття файлу
- •Функції введення-виведення
- •Робота з текстовими файлами
- •Функція форматованого виведення printf ()
- •Основні формати
- •Модифікації форматів
- •Функція форматованого введення scanf ()
- •Робота функції scanf ()
- •Призначеня функцій бібліотеки введення-виведення
- •Макрокоманди
- •Потокові інтерфейси введення-виведення
- •Ближні покажчики (near)
- •Дальні покажчики (far)
- •Покажчики huge
- •Функції для роботи з рядками
- •Динамічні рядки, клас string
- •Визначення поточної робочої директорії
- •Визначення поточного каталогу диска
- •Визначення / встановленн поточного диска
- •Пошук файлу
- •Створення, видалення, зміна директорій
- •Приклад програми для роботи з директоріями
- •Перегляд каталогу диска
- •Параметри структури ffblk
- •Робота з клавіатурою
- •Робота з файлами
- •Послідовний доступ до елементів двійкових файлів
- •Організація довільного доступу до елементів двійкових файлів
- •Робота динамічних структур даних.
- •Функції управління пам'яттю
- •Атрибути файлів.
- •Параметри
- •Динамічні структури даніх
- •Лінійні списки
- •Стек. Загальні поняття.
- •Приклад використання стеку
- •Основні визначення
- •Приклад використання дерев
Використання вказівників в програмі
У мові "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. Відкриття файлу
