Листинг 3.3. Многомерные массивы

#include <iostream>

using namespace std;

int main (void)

{

const int dasize = 3;

double darray2d[dasize][dasize] = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 } };

for (int i = 0; i < dasize; i++)

{

for (int j = 0; j < dasize; j++)

cout << darray2d[i][j] << " ";

cout << endl;

}

const int fasize = 10;

float farray4d[fasize][fasize][fasize] = {};

return 0;

}

3.2.2. Динамические массивы

В том случае, если количество элементов массива неизвестно заранее, можно воспользоваться одним из двух способов. Первый заключается в том, чтобы заранее выделить в стековом фрейме достаточное количество памяти, указав такую размерность, которая, как ожидается, не будет превышена. Однако мало того, что такой подход крайне неэффективен в аспекте занимаемой программой памяти, так еще все же может быть превышена указанная размерность. При втором подходе, память для элементов массива выделяется динамически, а доступ к ней производится через указатель. Важным аспектом здесь является тот факт, что доступ к обычному массиву происходит по указателю на его первый элемент, а адрес некоторого элемента массива представляет собой число, равное сумме адреса начального элемента и произведения индекса требуемого элемента на тип элементов массива. Так третий элемент массива «int» – значений (для «int», размер которого составляет четыре байта), расположенного начиная с адреса, к примеру, 0x22FF00, имеет адрес 0x22FF0С.

Благодаря этому, после выделения памяти работа с идентификатором указателя на динамически выделенную память происходит также, как и с идентификатором обычного массива.

Листинг 3.4. Динамические массивы.

#include <iostream>

using namespace std;

int main (void)

{

unsigned int x;

int *pinta;

cin >> x;

//выделение памяти под x значений типа int;

pinta = new int[x];

for (int i = 0; i < x; i++)

pinta[i] = i;

//операция освобождения памяти для массивов имеет «[]»;

delete[] pinta;

return 0;

}

При использовании многомерных динамических массивов следует учитывать тот факт, что динамические подмассивы не располагаются в смежных ячейках. В связи с этим, для создания, к примеру, двухмерного массива необходимо создать указатель на одномерный массив, каждый элемент которого, в свою очередь, будет также являться указателем на массив. Создание каждого отдельного подмассива, как и его удаление, должно быть явным.

Листинг 3.5. Многомерные динамические массивы.

#include <iostream>

using namespace std;

int main (void)

{

unsigned int x, y;

cin >> x >> y;

//указатель на массив указателей на миссив

// из x элементов типа int каждый;

int **pinta = new int*[x];

//явное создание подмассивов;

for (int i = 0; i < x; i++)

pinta[i] = new int[y];

//явное удаление подмассивов;

for (int i = 0; i < x; i++)

delete[] pinta[i];

delete[] pinta;

return 0;

}

3.3. C – Строки

В языке С++ существует два вида строк. Первый тип – строки в стиле языка С, представляющие из себя «char» – массивы с нулевым завершающим элементом. Работа с такими строками не отличается от работы с обыкновенными «char» – массивами. В стандартном библиотечном файле «cstring» объявлены функции по работе с С – строками.

Вторым типом строк являются объекты стандартного класса «string». Данный класс будет рассмотрен позднее.

Таблица 3.1. Основные функции по работе с С – строками.

Определение Описание
char *strcat(str1, str2), char *str1, *str2; Сцепление двух строк
char *strncat(str1, str2, n); char *str1, *str2; int n; Сцепление двух строк, где из второй берется не более n символов
int strcmp(str1, str2); char *str1, *str2; Сравнение двух строк в лексикографическом порядке
int strncmp(str1, str2, n); char *str1, *str2; int n; Сравнение первых n символов двух строк в лексикографическом порядке
char *strcpy(str1, str2); char *str1, *str2; Копирование строки str1 в строку str2
char *strncpy(str1, str2, n); char *str1, *str2; int n; Копирование не более первых n символов строки str1 в строку str2
int strlen(str); char *str; Определение длинны строки (без нулевого символа)
char *strchr(str, n); char *str; int n; Нахождение первого вхождения символа n
char *strrchr(str, n); char *str; int n; Нахождение последнего вхождения символа n
char *strpbrk(str1, str2); char *str1, *str2; Нахождение в строке str1 любой символ из строки str2
int strspn(str1, str2); char *str1, *str2; Определение длинны части строки str1, содержащей символы из строки str2
int strcspn(str1, str2); char *str1, *str2; Определение длинны части строки str1, не содержащей символы из строки str2
char *strtok(str1, str2); char *str1, *str2; Выделение из строки str1 отрезков, разделенных символами из строки str2

Наши рекомендации