Программирование >>  Дополнительные возможности наследования 

1 ... 67 68 69 [ 70 ] 71 72 73 ... 265


Вычисления с указателями

Один указатель можно вычитать из другого. Если, например, два указателя ссылаются на разные элементы массива, вычитание одного указателя из другого позволяет получить количество элементов массива, находящихся между двумя заданными. Наиболее эффективно эта методика используется при обработке символьных массивов (листинг 8.11).

Листинг 8.11. Выделение сдов из массива снмвпдпв

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

#include <lostream.h> #include <ctype,h> ftinclude <string.h>

bool GetWord(char* string, char* word. int& wordOffset); основная программа int mainO {

const ]nt bufferSize = 255:

char buffer [buf fer SizG+1 ]; переменная для хранения всег строки char word[bufferSize+1 ]: перемеиггая для хранения слова

mt wordOffset = 0: начинаем с первого символа

cout Enter а string: : cin.getline(buffer,bufferSize):

while (GetWord(buffer,word,wordOffset)) {

cout Got this word: word << endl:

return 0; }

Функция для выделения слова из строки символов, bool GetWord(char* string, char* word, int& wordOffset) {

if (! string[wordOffset]) определяет конец строки return false:

char *p1, .p2;

pi = p2 = atring+wordOffset; указатель на следующее слово

уда/1япм ведущие пробели

for (int 1 = 0; ]<(i[U)strlcn(p1) && ! 1на]пит(р10]); i++) р1++;



40 41 42 43 44 45 46 47

50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

иронерка 11,1лиия слона If (hKnlrujm(p1[0])) return 1nlso:

уканни!Л1 >1 тжпэинао! инчало сисдующгч о слова 1ак Ml как и [2 р2 = 1)1;

мерпмещаом р2 н конец слова while (isalnm.i(p2[0])) р2++;

р2 указывает на коноц плова а р1 - в начало

разность указптолей покааываот длину слова int len = inl (р2 - pi);

копируем слопо в буфер St гпсру (wurd, р1, len);

и добавляем символ разрыва сроки word[len]=\ О;

ищем начало следующего слова

for (int i = int(p2-strlng): i<(int)strlen(strlng) && ! isalnuni(p2[0]); i++) p2++;

wordOffsot = int(p2-string);

return truo; }

Enter a string: tins code first appeared in С++ Report

Gut this word

Got this word

Got this word

Got this word

Got this word

Got this word

this

code

first

appeared

Got this word: Report

В строке 13 пользователю предлагается ввести строку. Строка считыва-ется функцией GetWord(), параметрами которой является буферизиро-ванная переменная для хранения первого слова и целочисленная переменная WordOffset. В строке 11 переменной WordOffset присваивается значение 0. По мере ввода строки (до тех пор пока GelWordO не возвратит значение 0) введенные слова отображаются на экране.



При каждом вызове функции GetWordO управление передается в строку 27. Далее, в строке 30, значение string[wordOffset] проверяется на равенство нулю. Выполнение условия означает, что мы находимся за пределами строки. Функция GetWordO возвращает значение false.

В строке 33 объявляются два указателя на переменную символьного типа. В строке 34 оба указателя устанавливаются на начало следующего слова, заданное значением переменной WordOffset. Исходно значение WofdOffsot равно О, что соответствует началу строки.

С помощью цикла в строках 37 и 38 указатель р1 перемещается на первый символ, являющийся буквой или цифрой. Если такой символ не найден, функция возвращает false (строки 41 и 42).

Таким образом, указатель р1 соответствует началу очередного слова. Строка 46 присваивает указателю р2 то же значение.

В строках 49 и 50 осуществляется поиск в строке первого символа, не являющегося ни цифрой, ни буквой. Указатель р2 перемещается на этот символ. Теперь р1 и р2 указывают на начало и конец слова соответственно. Вычтем из значения указателя р2 значение р1 и преобразуем результат к целочисленному типу. Результатом выполнения такой операции будет длина очередного слова (строка 55). Затем на основании данных о начале и длине полученное слово копируется в буферную переменную.

Строкой 61 в конец слова добавляется концевой нулевой символ, служащий сигналом разрыва строки. Далее указатель р2 перемещается на начало следующего слова, а переменной WordOffset присваивается значение смещения начала очередного слова относительно начала строки. Возвращая значение true, мы сигнализируем о том, что слово найдено.

Чтобы как можно лучше разобраться в работе программы, запустите ее в режиме отладки и последовательно, шаг за шагом, проконтролируйте выполнение каждой строки.

Резюме

Указатели являются мощным средством непрямого доступа к данным. Каждая переменная имеет адрес, получить который можно с помощью оператора адреса (&). Для хранения адреса используются указатели.

Для объявления указателя достаточно установить тип объекта, адрес которого он будет содержать, а затем ввести символ и имя указателя. После объявления указатель следует инициализировать. Если адрес объекта неизвестен, указатель инициализируется значением 0.

Для доступа к значению, записанному по адресу в указателе, используется оператор разыменования (*). Указатель можно объявлять константным. В этом случае не допускается присвоение данному указателю нового адреса. Указатель, хранящий адрес константного объекта, не может использоваться для изменения этого объекта.

Чтобы выделить память для хранения какого-либо объекта, используется оператор new, а затем полученный адрес присваивается указателю. Для освобождения зарезервированной памяти используется оператор delete. Сам указатель при освобождении памяти не уничтожается, поэтому освобожденному указателю необходимо присвоить нулевое значение, чтобы обезопасить его.



1 ... 67 68 69 [ 70 ] 71 72 73 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика