Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторн_робот_Ч2.doc
Скачиваний:
19
Добавлен:
03.11.2018
Размер:
2.12 Mб
Скачать

2. Теоретичні відомості

Строки і вказівники. Розглянемо наступні два визначення:

char A[20];

/* Масив, у який можна записати рядок */

char *B;

/* Вказівник, з яким можна зв'язати рядок */

Масив А одержує пам'ять автоматично при обробці визначення. Стрічці, з якою ми хочемо зв'язати вказівник В, пам'ять при обробці визначення вказівника не виділяється. Тому якщо далі слідують оператори

scanf ("%s",A) ; /* Оператор вірний */

scanf("%s",B)/ /* Оператор не коректний */

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

Наприклад, оператор

B=(char *) malloc(80);

виділяє 80 байт і зв'язує цей блок пам'яті з вказівником В. Тільки тепер застосування приведеного вище оператора введення припустимо. Прототипи функції malloc() і інших функцій розподілу пам'яті знаходяться у файлі stdlib.h

За допомогою вказівників типу char* зручно одержувати доступ до рядків у виді масивів символів. Типова задача - обробка слів чи речень, кожне з який представлене в масиві типу char у виді рядка (тобто наприкінці представлення речення чи слова знаходиться нуль-символ '\0'). Використання вказівників, а не масивів з фіксованими розмірами особливо доцільно, коли речення чи слова повинні бути різної довжини. У наступній програмі визначений і при ініціалізації зв'язаний з набором рядків одномірний масив point[] вказівників типу char*. Функція printf() і специфікатор перетворення %s допускають використання як параметр вказівник на рядок. При цьому на дисплей (у вихідний потік) виводиться не значення вказівника point[і], а вміст адресованого йому рядка.

Текст програми:

#include <stdio.h>

Void main( )

{

char * point[ ]={"thirteen","fourteen",

"fifteen","sixteen","seventeen","eighteen",

"ninteen"};

int і, n;

n=sizeof(point)/sizeof(point[0]);

for (i=0 ; i<n; i++)

printf("\n%s",point[i]);

}

Результат виконання програми:

thirteen

fourteen

fifteen

sixteen

seventeen

eighteen

ninetee

Строки, як параметри функцій. Стрічки в якості фактичних параметрів можуть бути специфіковані або як одновимірні масиви типу char[], або як вказівники типу char*. В обох випадках за допомогою параметра в функцію передається адрес початку символьного масиву, що містить стрічку. На відміну від звичайних масивів для параметрів-стрічок немає необхідності явно вказувати їх довжину. Признак '\0', що розміщується в кінці кожної стрічки, дозволяє завжди визначити її довжину, точніше, дозволяє перебирати стрічки і не вийти за її межі. Як приклад використаня стрічок в якості параметрів функцій розглянемо декілька функцій, що розв’язують типові задачі обробки стрічок. Аналогії більшості з приведених нище функцій є в бібліотеці стандартних функцій компілятора. Їх прототипи і інші засоби зв’язку з цими функціями знаходяться в заголовочних файлах string.h і stdlib.h.