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

Второй пример

Вы только что узнали, что, используя указатель, ваша функция может сканировать строку символов, пока не будет обнаружен символ NULL. Следующая программа PTR_LEN.CPP использует указатель на строку в функции string_length для определения количества символов в строке:

#include <iostream.h>

int string_length(char *string)

{     int length = 0;     while (*string != '\0')

   {        length++;        string++;     }     return(length);  }

void main(void)

{     char title[] = "Учимся программировать на языке C++";     cout << title << " содержит " << string_length(title) << " символов";  }

Как видите, функция string_length сканирует символы строки до тех пор, пока не встретит символ NULL.

Увеличение указателя на символьную строку

Когда программа передает массив в функцию, C++ передает адрес памяти первого элемента этого массива. Используя переменную-указатель, функция может перемещаться по содержимому массива, просто увеличивая значение указателя. Например, предположим, что программа передает в функцию символьную строку "Привет". Внутри функции переменная-указатель сначала указывает на участок памяти, который содержит букву 'П'. Когда функция увеличивает указатель, то он далее указывает на участок памяти, который содержит букву 'р'. По мере увеличения функцией значения указателя, он поочередно указывает на каждую букву в строке и наконец указывает на символ NULL.

Уменьшение количества операторов

Чтобы определить конец символьной строки, каждая из предыдущих программ использовала следующий цикл while:

while (*string != '\0')

Как уже обсуждалось, символ NULL ('\0') представляет собой значение ASCII 0. Так как C++ использует значение 0, чтобы представить ложь, ваши программы могут записать предыдущий цикл следующим образом:

while (*string)

В данном случае пока символ, определяемый указателем строки, не равен 0 (NULL), условие оценивается как истинное и цикл будет продолжаться. Из урока 5 вы узнали, что постфиксная операция увеличения C++ позволяет вам использовать значение переменной, а затем увеличивает это значение. Многие программы на C++ используют постфиксные операции увеличения и уменьшения, чтобы сканировать массивы с помощью указателей. Например, использование постфиксной операции увеличения делает следующие циклы while идентичными:

while (*string)

{     cout << *string++;  }

while (*string)  {     cout << *string;     string++;  }

Оператор cout << *string++, заставляет C++ вывести символ, указываемый указателем string, а затем увеличить текущее значение string,чтобы он указывал на следующий символ. С помощью этих методов следующая программа SMARTPTR.CPP иллюстрирует новую реализацию функций show_string и string_length:

#include <iostream.h>

void show_string(char *string)

{     while (*string) cout << *string++;  }

   int string_length(char •string)

(     int length = 0;     while (*string++) length++;     return(length) ;  }

void main(void)

{     char title[] = "Учимся программировать на языке C++";     show_string(title) ;     сout << " содержит " << string_length(title) << " символов";  }

Если вы встретите функции C++, которые манипулируют строками с помощью указателей, то они с большой долей вероятности будут использовать подобную краткую запись.

Сканирование символьной строки

Одно из наиболее широко употребляемых использовании указателей в программах на C++ заключается в сканировании символьных строк. Для уменьшения количества кода многие программы используют следующие операторы для сканирования строки:

while (*string)

{     // операторы     string++;     // продвинуть к следующему символу  }

Следующая функция string_uppercase использует указатели для преобразования символов строки в символы верхнего регистра:

char *string_uppercase(char* string)

{     char *starting_address = string; // адрес string[0];     while (*string)

   {        if ((*string >= 'а') && (*string <= 'я')) *string = *string - 'a' + 'A';        string++;     }     return(starting_address);  }

Эта функция сохраняет и возвращает начальный адрес строки, ко торый позволяет вашим программам использовать функцию следующим образом:

cout << Btring_uppercase("Привет, мир!") << endl;

* Поскольку при переводе книги обрабатываемые символы заменены с английских на русские, то этот алгоритм работает не для всех кодировок кирилицы в DOS и Windows. — Прим. перев.