Листинг 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 |