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

6.4 Операції порівняння

Крім раніше розглянутих операцій адресної арифметики, до покажчиків можна застосувати операції порівняння == , і! =. Навіть операції відношення <,> = і т.п. працюють правильно, якщо покажчики посилаються на елементи одного і того ж масиву. Можливе навіть віднімання посилань. Наприклад, u і s посилаються на елементи одного масиву, то us є число елементів між u і s. Спочатку u вказує на перший символ рядка (char * u = s). Потім у циклі по черзі перевіряється кожен символ, поки зрештою не буде виявлений "\ 0". Різниця us дає саме довжину рядка.

Приклад 6.9. Функція length (рис. 6.9)

int length (char * s) { /* довжина рядка */

char * u = s;

while (* u! = '\ 0')

u++;

return (u – s);

}

Рисунок 6.9 – Ілюстрація функції length

Для даного випадку u-s = 3 (останній нуль-символ не рахується).

Приклад 6.10. Збільшення поточного значення покажчика на одиницю.

int length (char * s)

{

int i;

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

i++;

return i;}

6.5 Копіювання рядка

Приклад 6.11. Копіювання рядка s1 в рядок s2 звичайним способом.

void copy (char s1 [],char s2){

int i = 0;

while ((s2[i] = s1[i])!='\0')

i ++;

}

Приклад 6.12. Копіювання рядка s1 в рядок s2 із використанням покажчиків.

void copy (char * s1, char * s2){

while ((* s2 =* s1)! = '\ 0')

s2 + +; s1 + +;

}

В даному прикладі операція копіювання поміщена безпосередньо в умові: ((* s2 =* s1)! = '\ 0'). Просування вздовж масивів до тих пір, поки не зустрінеться "\ 0", забезпечують оператори s2++ та s1++. Їх теж можна помістити в умову.

Приклад 6.13. Копіювання рядка s1 в рядок s2 із використанням циклу while.

void copy (char * s1, char* s2){

while ((*s2 + + = *s1 + +)! = ' \ 0 ');

}

Унарні операції типу *і++ виконуються справа наліво. Значення *s++ вважається символ, на який вказує s до його збільшення. Так як значення "\ 0" є нуль, а цикл while перевірить, чи не нуль вираз в дужках. Так поступово функція копіювання стає все більш компактною.

У мові С символьний рядок, фактично розглядається як покажчик на нульовий елемент масиву .

Приклад 6.14. Вираження символьної стрічки як "рядок".

char * ptr; ptr = "Калейдоскоп";

Останній оператор присвоює покажчиком адресу нульового елемента рядка, тобто символу "К". Може вииникнути запитання, де знаходиться масив, що містить символи "Калейдоскоп"? Ми його ніде не описували. Відповідь така: цей рядок ― константа.

Приклад 6.15. Друкування рядка символів у зворотному порядку.

# include <stdio.h>

int main ()

{

char * ptr1, * ptr2;

ptr1 = ptr2 = "Калейдоскоп";

while (* ptr! = '\ 0')

putchar (* ptr2 + +);

putchar ('\ n');

while (--ptr2> = ptr1)

putchar (* ptr2);

putchar ('\ n');

}

На самому початку покажчиками ptr1 і ptr2 присвоюється початкові адреси рядка "Калейдоскоп". Потім рядок посимвольно друкується і одночасно покажчик ptr2 зміщується вздовж рядка. В кінці ptr2 вказує на останній символ вихідного рядка. У другому циклі while все той же покажчик ptr2 починає змінюватися в зворотному напрямку, зменшуючись до тих пір, поки він не буде вказувати на нульовий елемент масиву, забезпечуючи видачу рядка в зворотному порядку.

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