В далі приведеній програмі 12.11 визначено два рядки: один – з використанням операцій масиву, інший – з використанням вказівників.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<bios.h>
int main()
{clrscr();
char str1[]="Означення через масив";
char* str2="Означення через вказівник";
cout<<str1<<endl;
cout<<str2<<endl;
// str1++;
str2++;
cout<<str2<<endl;
bioskey(0);
return 0;
}
Програма 12.11
В багатьох випадках ці два способи еквівалентні, обидва рядки ми можемо роздрукувати. Але є й різниця: str1 – вказівник-константа, а str2 – вказівник-змінна. Тому str2 може змінювати своє значення, а str1 – ні. Тому з str2 можлива операція ++ (виконуючи її, ми просуваємося вздовж рядка), а з str1 – ні.
Рядок, визначений як вказівник, значно гнучкіший, ніж визначений як масив.
Рядки як аргументи функцій
В програмі 12.12 показано, як рядки використовуються в якості аргументів. Функція друкує рядок, виводячи знаки по черзі.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<bios.h>
int main()
{clrscr();
void dispstr(char*);//прототип
char str[]=”Oзначення через масив”;
dispstr(str);
bioskey(0);
return 0;
}
void dispstr(char*ps)
{while(*ps)//доки не досягнуто кінця рядка
cout<<*ps++;//посимвольний вивід
cout<<endl;
}
Програма 12.12
Адреса масиву str використана як аргумент при виклику функції dispstr(). Ця адреса є константою, але, оскільки вона передається за значенням, то в функції dispstr() створюється його копія. Це буде вказівник ps. Він може бути змінений і функція збільшує його, виводячи рядок на дисплей. Вираз *ps++ повертає наступний знак рядка. Цикл повторюються до досягнення знаку кінця рядка ‘\0’. Оскільки він має значення 0, яке інтерпретується як false, то в цей момент цикл закінчується.
Копіювання рядків з використанням вказівників
Вказівники можна використовувати для вставки значень в масив, як це показано в програмі 12.13: вона містить функцію, що копіює один рядок в інший.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<bios.h>
int main()
{clrscr();
void copystr(char*,const char*);//прототип
char* str1=”Копіювання через вказівник”;
char str2[80];
copystr(str2,str1);
cout<<str2<<endl;
bioskey(0);
return 0;
}
void copystr(char*dest,const char* str)
{while(*str) //доки не досягнуто кінця рядка
*dest++=*str++;//копіювання
*dest=’\0’;//символ кінця рядка
}
Програма 12.13