Масиви та покажчики символьних рядків
Покажчики
Покажчик оголошується так:
Операції над покажчиками.З покажчиками пов'язані дві спеціальні операції & та *. Обидві ці операції є унарними, т. е. вони мають один операнд, якими ставляться.
У покажчику дуже важливим є базовий тип, т.к. він визначає, скільки байтів займає об'єкт, який вказує покажчик. Якщо int - 2 байти, char - один байт і т.д. Найпростіші дії із покажчиками продемонструємо на наступній програмі.
printf(“x = %f y = %f”, x, y); //Результат: x=10.1; y=10.1; pf=632
printf (“x = %f y = %f”, x, y); //Результат: x=10.1; y=10.1; pf=636
printf (“x = %f y = %f”, x, y); //Результат: x=10.1; y=1; pf=636
Як і над іншими типами змінних, над покажчиками можна проводити арифметичні операції додавання та віднімання, а також операції (++) і (--). Покажчики можна порівнювати. Застосовуються шість операцій:
Якщо вказівнику надано значення 0, це означає, що цей покажчик не вказує на жодний об'єкт. Спроба використовувати це значення під час звернення до динамічного об'єкта приведе до помилки. За згодою, для позначення константи з нульовим значенням використовується ім'я NULL.
1.2.1 Динамічні об'єкти
Вказівники використовуються при створенні та обробці динамічних об'єктів.
Динамічні об'єкти, на відміну заздалегідь визначених, створюються у процесі виконання програми.
Для цього служать спеціальні функції:
malloc() та calloc().
Специфікації даних функцій:
unsigned size (обсяг пам'яті, який потрібно виділити в байтах);
char * calloc (nelem, elsize);
unsigned nelem (кількість елементів, для яких необхідно виділити пам'ять)
unsigned elsize (обсягпам'яті, яку необхідно виділити для кожного елемента)
Обидві функції повертають покажчик, що вказує на створений динамічний об'єкт (на ділянку виділеної пам'яті).
Для визначення необхідного обсягу пам'яті можна використовувати оператор sizeof (T), який повертає кількість байт необхідних зберігання значень об'єкта T у пам'яті.
int P = (int *) malloc (sizeof (int));
Виділяється пам'ять одного цілого значення. Адреса цієї області пам'яті присвоюється змінної p після перетворення з типу char* до типу int*.
Оголошення одновимірного масиву:
Оголошення двовимірного масиву за допомогою покажчиків:
int **r = (int**) malloc(n*sizeof(int*));
Таким чином, дія запису
можна пояснити так
// Наступні операції дадуть той самий результат:
// Наступна операція додасть 2 до першого елементу:
При цьому слід враховувати, що
Існують деякі обмеження на операції із покажчиками-константами. Зокрема, в наступному прикладі показано неприпустиму конструкцію:
mas=ptr; // Неприпустимий оператор, оскільки mas - покажчик-константа та її значення змінити не можна.
Крім того, наприклад, операції одиничного збільшення можна застосовувати тільки до змінних. Тому ptr++ – допустима конструкція, а mas++ – заборонена. Проте й у тому й іншому випадку можна використовувати операції додавання з покажчиком, тобто. ptr+i; та mas + i; - Допустимі конструкції.
Покажчики та багатовимірні масиви.Розглянемо двовимірний масив та дії з покажчиками.
ptr зараз свідчить про перший стовпець першого рядка, тобто.
ptr+3 = = &mas [1] [1] і т.д.
Двовимірний масив можна як масив масивів. У нашому випадку ми маємочотирьох елементний масив, що складається із двох елементів. Примітно, що це чотири елементний масив можна як одномірного mas[0],…,mas[3]. У цьому ім'я масиву як і є покажчиком з його перший елемент, тобто. mas[0]= =&mas[0] [0] . На що будуть вказувати mas[i]? І тут mas [i] вказує на i-ту рядок, тобто. на перший елемент i-го рядка. Таким чином
Масиви та покажчики символьних рядків
Часто буває необхідна робота з символьними рядками. У мові Сі немає спеціального типу «рядок». Натомість кожен символьний рядок у пам'яті ЕОМ представляється як одномірного масиву типу char, останнім елементом якого є символ '\0'.
При цьому можливі такі типи визначень символьних масивів:
1) «Прямолінійне», тобто. задається масив типу char із зазначенням конкретного значення граничного розміру, що відповідає максимальному числу символів у рядку. Наприклад, визначимо символьний масив для зберігання 10 рядків, кожен з яких може містити не більше 20 символів:
2) При визначенні масиву один з його граничних розмірів (лівий індекс) можна не вказувати. У цьому випадку кількість елементів масиву визначається, наприклад, при ініціалізації:

У першому і другому випадку спостерігається нераціональне використання пам'яті. Навіть для коротких рядків завжди виділяється те саме кількість байт, заздалегідь зазначене як граничних значень у першому і другому випадках щодо масивів string_1 і string_2.
3) За допомогою масиву покажчиків типу char*: