Взаимосвязь строк и указателей.
Мы с Вами уже обсуждали тему указателей в одном из уроков, и Вы должны
помнить, как тесно они связаны с массивами. Поэтому сегодня мы так же не сможем
обойти указатели стороной. В программе доступ к строке осуществляется с помощью
указателя на символ. Если описать переменную message как
то в результате выполнения оператора
message станет указателем на строку. Обратите внимания, что оператор
cin нельзя будет применять к такому указателю.
#include <iostream>
using namespace std;
char *message;
char privet[] = "and bye!";
char *pr = privet;
void main ()
{
message = "Hello";
cout << " " << message << " " << pr << "\n";
int i = 0;
while (*(pr+i)!='\0')
{
cout<< *(pr+i++) << " ";
}
}
|
Использование указателей часто применяется при работе с массивом строк. В
этом случае к каждой строке можно обратиться с помощью указателя на его первый
символ. Это удобно тем, что для перестановки двух строк, расположенных в
неправильном порядке, фактически достаточно переставить указатели в массиве
указателей, а не сами строки.
Рассматривается функция month_name(), которая возвращает указатель на
строку, содержащий имя n-го месяца. Это типичная задача для использования
строкового массива.
Функция month_name() содержит локальный массив строк и при обращении к
ней возвращает указатель на нужную строку.
В описании массива указателей на символы name[] инициализатором
является просто список строк. Символы i-й строки помещаются в определенное место
памяти, а указатель на ее начало хранится в элементе name[i]. Поскольку
размер массива name не указан, компилятор сам подсчитывает количество
инициализаторов и соответственно устанавливает правильное число.
#include <iostream>
using namespace std;
const int n=15;
void main ()
{
char *month_name(int);
/* ------------- */
for (int i=0; i < n; i++)
cout << "Month number " << i << " - " << month_name(i) <<"\n";
}
/* ------------------------------------------- */
char *month_name (int k) /* Название k-го месяца */
{
static char *name[] = {
"none","January",
"February","March","April",
"May","June","July","August",
"September","October","November",
"December"
};
return (k<1||k>12)?name[0]:name[k];
}
|
Результат работы программы:
Month number 0 - none
Month number 1 - January
Month number 2 - February
Month number 3 - March
Month number 4 - April
Month number 5 - May
Month number 6 - June
Month number 7 - July
Month number 8 - August
Month number 9 - September
Month number 10 - October
Month number 11 - November
Month number 12 - December
Month number 13 - none
Month number 14 - none
Press any key to continue
|