Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР15-С++24-мая-2012.doc
Скачиваний:
23
Добавлен:
23.09.2019
Размер:
1.07 Mб
Скачать

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

По форме записи данная конструкция ничем не отличается от указателя на символьную переменную: char *S1;

где char – тип указателя на символ, S1 – переменная-указатель.

Для инициализации указателя требуется указать область памяти, где уже находится или будет находиться строка, при этом для строки должен быть выделен необходимый объем памяти.

Существует ряд способов инициализации указателя на строку:

     инициализация строковым литералом char *S1="Yes";

     присваивание значение другого указателя char *S1=S;

где S – идентификатор массива или указатель на другую строку символов.

Указателю можно присваивать значение другого указателя: S1=S;

где S1 – переменная типа указатель; S – строковая константа, идентификатор массива или указатель на другую строку символов.

Например, char *S1, S[10]="Yes"; S1=S;

При этом создаются переменная-указатель S1 и массив символов S, под который выделяется поле длиной 10 символов, 4 из которых будут заполнены. Затем в переменную-указатель записывается адрес символьного массива (рис. 15.1).

Рис. 15.1. Строковая константа и указатель

Как вы уже знаете, указатель содержит адрес памяти. Когда ваша программа передает массив (например, символьную строку) в функцию, C++ передает адрес первого элемента массива. В результате совершенно обычно для функции использовать указатель на символьную строку. Чтобы объявить указатель на символьную строку, функция просто предваряет имя переменной звездочкой, как показано ниже:

void some_function(char *string);

Звездочка, которая предваряет имя переменной, указывает C++, что переменная будет хранить адрес памяти — указатель. Следующая программа PTR_STR.CPP использует указатель на символьную строку внутри функции show_string для вывода содержимого строки по одному символу за один раз:

#include <iostream.h>

void show_string(char *string)

{

   while (*string != '\0')

   {

      cout << *string;

      string++;

    }

}

void main(void)

{

   show_string( "Учимся программировать на языке C++!");

}

Обратите внимание на цикл while внутри функции show_slring. Условие while (*string != '\0') проверяет, не является ли текущий символ, указываемый с помощью указателя string, символом NULL, который определяет последний символ строки. Если символ не NULL, цикл выводит текущий символ с помощью cout. Затем оператор string++; увеличивает указатель siring таким образом, что он указывает на следующий символ строки. Когда указатель string указывает на символ NULL, функция уже вывела строку и цикл завершается.

Рис. 15.2. Сканирование строки с помощью указателя.

Предположим, например, что строка, переданная в функцию, находится в памяти компьютера по адресу 1000. Каждый раз, когда функция увеличивает указатель string, он указывает на следующий символ (адрес 1001,1002, 1003 и т. д.), как показано на рис. 15.2.

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

Вы только что узнали, что, используя указатель, ваша функция может сканировать строку символов, пока не будет обнаружен символ NULL. Следующая программа использует указатель на строку в функции 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.