Тут проблема далеко не только с массивами Настя...)) Кто ж это Вас учил имена функций и переменных транслитом писать? ))
Значит так, давайте разберёмся что такое массив. Массив это некая область памяти; Резервируется компилятором во время объявления, то есть :
- встретив такое в исходном коде компилятор выделяет область памяти достаточную для размещения size элементов типа T. Именно потому что выделение памяти для такого массива происходит во время компиляции, size массива должен быть константным значением.
Важно понимать что имя массива есть указатель на первый(то есть нулевой) его элемент. Казалось бы вот безнадёга - а что делать когда заранее неизвестно сколько мы элементов будем хранить в этом массиве?
На такой случай в С++ предусмотренны средства для динамического выделения памяти, то есть во время выполнения.
Чтобы получить массив элементов типа T размером N полученным в runtime откуда то,надо проделать следующие телодвижения:
Код: Выделить всё
T* array = new T[N]; // массив элементов типа T размера N
А итерироваться по элементам такого массива можно например вот так:
Код: Выделить всё
for(int i=0;i<N;++i)
{
array+i; //Это альтернативная запись array[i];
}
Двумерный массив это массив указателей на массивы,
то есть это массив каждый элемент которого тоже является массивом(помним что имя массива есть указатель на его первый(нулевой) элемент).
Самый очевидный пример двумерного массива это массив строк.
Что такое строка? В простейшем случае это обычный массив элементов типа char, и создаётся он динамически точно так же как и массив любого другого типа:
А как же создать массив строк? Помня что строка это char* создаём:
Код: Выделить всё
/*
Создаём массив размером N каждый елемент которого char*
*/
char** string_array = new char*[N];
"Ух ты как просто!" - скажете Вы и будете неправы. Да, мы создали массив указателей на char. Но указатели эти неинициализированны, а обращение по неинициализированному указателю ведёт к разным нехорошим последствием - от GPF до порчи чужих данных;
Следовательно надо их инициализировать,вот таким вот образом:
Код: Выделить всё
for(int i=0;i<N;++i)
{
/*
N указателей на char инициализируются массивами типа char
длинной L
*/
string_array[i] = new char[L];
}
Вот теперь всё, у нас есть двумерный массив элементов типа char NxL;
Соответственно таким же образом можно создать двумерный массив для любого типа данных.Кстати, после окончания работы с памятью выделенной динамически, её необходимо освободить. В C++ это делается так:
Код: Выделить всё
/*
Освобождаем память, ранее выделенную под массив;
*/
delete[] array;
Код: Выделить всё
/*
Освобождаем память, ранее выделенную под двумерный массив
*/
for(int i=0;i<N;++i)
{
delete[] string_array[i]; //Сначала для каждого массива в массиве ;)
}
delete[] string_array; //А затем и для самого массива
Поиск элемента в массиве. Элементарно пробегаем каждый массив в нашем массиве(помним что каждый элемент нашего массива тоже массив) сравнивая каждый элемент с заданным K:
Код: Выделить всё
for(int i=0;i<N;++i)
{
for(int j=0;j<L;++j)
{
if(string_array[i][j] == K)
{
cout<<"Искомый элемент найден в позиции "<<'['<<i<<','<<j<<']'<<endl;
}
}
}