|
Программирование >> Структурное программирование
Заметим, что первый аргумент и в copyl, и в сору2 должен быть достаточно большим массивом, чтобы вмеш;ать строку, содержащуюся во втором аргументе. В противном случае может произойти ошибка из-за попытки записи в ячейки памяти, выходящие за границы массива. Отметим также, что второй параметр каждой функции объявляется как const char * (константа строка). В обеих функциях второй аргумент копируется в первый - символы копируются из второго аргумента один за одним, но никогда не модифицируются. Поэтому второй параметр объявляется для указания на константное значение, чтобы реализовать принцип наименьших привилегий. Ни для одной из функций не требуется возможность модифицировать второй аргумент и поэтому ни одна из них не обеспечена этой возможностью. Использование нотаций индексирования и указателей при работе с массивами iinclude <iostream.h> main{) { int b[ ] = {10, 20, 30, 40}; int *bPtr = b; задание bPtr как указателя на массив b cout Массив b печатается с использованием: << endl I << Нотации индексов массива << endl; for (int i = 0; i <= 3; i++) cout b[ i ]= b[ i ] endl; cout << endl << Записи указатель/смещение, в которой endl << указатель является именем массива << endl; for (int offset = 0; offset <= 3; offset++) cout *(b + offset ) = *(b + offset) endl; cout << endl << Нотации индекса указателя << endl; for (i = 0; i <= 3; i++) cout bPtr[ i 1 = bPtr[i] endl; cout << endl << Нотации указатель/смещение << endl; for (offset = 0; offset <= 3; offset++) cout *(bPtr + offset ) = << *(bPtr + offset) endl; return 0; } Рис. 5.20. Использование четырех методов ссылки на элементы массива (чааь 1 из 2) Массив Ь печатается с использованием: Нотации индексов массива Ь[0] = 10 Ь[11 = 20 Ь[2] = 30 Ь[3] = 40 Записи указатель/смещение, в которой указатель является именем массзюа *(Ь + 0) =10 *(Ь + 1) =20 *(Ь + 2) =30 *(Ь + 3) =40 Нотации индекса указателя bPtr[0] = 10 bPtr[l] = 20 bPtr[2] = 30 bPtr[3] = 40 Нотации указатель/смещение *(bPtr +0) =10 *(bPtr +1) =20 , *(bPtr +2) =30 Ш *(bPtr +3) =40 Рис. 5.20. Использование четырех методов ссылки на элементы массива (чааь 2 из 2) I Копирование строки с использованием нотации массивов f,4 и указателей ttinclude <iostream.h> void copyl(char *, const char *); void copy2(char *, const char *); main() { char stringl[10], *string2 = Привет , string3[10], string4[] = До свидания ; copyl(stringl, string2); cout stringl = stringl endl; copy2(strings, string4); *.\ cout strings = strings endl; fes return 0; Рис. 5.21. Копирование ароки с использованием нотации массивов и указателей (чааь 1 из 2) for ( ; (*sl = *s2) != \0; sl++,s2++) ; пустое тело stringl = Привет strings = До свидания Рис. 5.21. Копирование строки с использованием нотации массивов и указателей (часть 2 из 2) 5.9. Массивы указателей Массивы могут содержать указатели. Типичным использованием такой структуры данных является формирование массива строк. Каждый элемент такого массива - строка, но в С++ строка является, по существу, указателем на ее первый символ. Таким образом, каждый элемент в массиве строк в действительности является указателем на первый символ строки. Рассмотрим объявление массива строк suit, который может быть полезным для представления колоды карт. char *suit[4] = { Черви , Бубны , Трефы , Пики }; Элемент объявления suit[4] указывает массив из 4 элементов. Элемент объявления char * указывает, что тип каждого элемента массива suit - указатель на char . Четыре значения, размещаемые в массиве - это Черви , Бубны , Трефы и Пики . Каждое из них хранится в памяти как строка, завершающаяся нулевым символом, которая на один символ длиннее, чем число символов текста, указанного в кавычках. Эти четыре строки имеют длину 6, 6, 6 и 5 символов соответственно. Хотя это выглядит так, словно эти строки помещены в массив suit, на самом деле в массиве хранятся лишь указатели (Рис. 5.22). Каждый из них указывает на первый символ соответствующей ему строки. Таким образом, хотя размер массива suit фиксирован, он обеспечивает доступ к строкам символов любой длины. Эта гибкость - один из примеров мощных возможностей структурирования данных в С++. Строки символов могли бы быть размещены в двумерном массиве, в котором каждая строка представляет одну масть, а каждый столбец представляет одну из букв имени масти. Такая структура данных должна иметь фиксированное количество столбцов на строку и это количество должно быть таким большим, как самая длинная строка. Поэтому затраты памяти на хранение большого количества строк, большинство из которых короче, чем самая длинная строка, будут значительными. Мы используем массивы строк для представления колоды карт в следующем разделе. Копирование s2 в si с использованием нотации массивов void copyl(char *sl, const char *s2) { for (int i = 0; (sl[i] = s2[i]) != \0; i++) ; пустое тело Копирование s2 в si с использованием нотации указателей void сору2(char *sl, const char *s2)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |