Int main(int argc, char* argv[])
{
short i, j; // текущие индексы
int k;
int *DArr;
printf("===================================\n");
DArr = new int[N * N]; // Динамически выделяем память под одномерный массив N*N
printf("---------- Arrays addresses ------------\n");
printf(" DArr = %p (%u)\n", DArr, DArr);
printf("------------------------------------\n");
for (i = 0; i < N; i++) // перебор строк
for (j = 0; j < N; j++) // перебор столбцов
*(DArr + i * N + j) = i * N + j + 1; // или DArr[i * N + j]
printf("\n----- Data by indexes ------\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
printf("%3d", DArr[i * N + j]); // Обращение к элементу массива по индексам
printf("\n"); // или *(DArr + i * N + j)
}
printf("\n----- Data by pointers ------\n");
for (k = 0; k < N * N; k++)
printf("%3d", *(DArr + k)); // Обращение к элементу массива по указателю,
printf("\n");
getch();
delete[] DArr; // освобождаем память, выделенную под массив указателей на строки
return 0;
}
Результат работы программы:
Если размер массива заранее не известен, то память под него можно выделить только динамически.
Пример 5. Переделать задачу из лабораторной работы № 6 так, чтобы можно было задавать размер массива в программе, выделять память динамически, повторять ее до тех пор, пока не будет нажата клавиша ESC.
Задача из лаб. раб. 6: Заполнить секторы матрицы, которые лежат выше и ниже главной и побочной диагоналей, линейной последовательностью чисел (1, 2, 3, ...) от левого верхнего угла вправо и вниз. Остаток матрицы заполнить нулями.
Алгоритм программы – в работе 6, необходимо только заменить статический массив на динамический, сделать цикл do-while, выход из которого возможен только по клавише ESC.
#define ESC 0x1B // Код клавиши Esc
Int main(int argc, char* argv[])
{
int **DArr;
short i, j; // текущие индексы
short r1,r2; // граничные номера столбцов
short dd; // модификатор граничных номеров
short k; // текущий член линейной последовательности
int Narr; // размер массива
char key;
do
{
printf(" Size of array = ");
scanf("%d", &Narr);
DArr = new int*[Narr];
for (i = 0; i < Narr; i++)
DArr[i] = new int[Narr];
printf("------ Arrays addresses---------\n");
printf(" DArr = %p (%u)\n", DArr, DArr);
for (i = 0; i < Narr; i++)
printf(" DArr[%d] = %p (%u), address DArr[%d] = %p (%u)\n",
i, DArr[i], DArr[i], i, &DArr[i], &DArr[i]);
printf("------------------------------------\n");
r1=1; // начальные значения переменных
r2 = Narr-2;
dd=1;
k=1;
for (i = 0; i < Narr; i++) // перебор строк
{
for (j = 0; j < Narr; j++) // перебор столбцов
{
if ((j < r1)||(j > r2))
DArr[i][j] = 0;
else
DArr[i][j] = k++;
}
r1 += dd; // модификация границ
r2 -= dd;
if (r1 > r2) // уcловие перехода в нижнюю часть
dd = -dd;
}
printf("\n----- Data by indexes ------\n");
for (i = 0; i < Narr; i++)
{
for (j = 0; j < Narr; j++)
printf("%3d", DArr[i][j]);
printf("\n");
}
printf("\n----- Data by pointers ------\n");
for (j = 0; j < Narr * Narr; j++)
{
if (!(j % Narr) && Narr > 5) // Чтобы при большом массиве выводить
printf("\n"); // в виде матрицы
printf("%3d", *(DArr[0] + j));
printf("\n\nRepeat?\n");
}
key = getch();
for (i = 0; i < Narr; i++) // Для каждой строки
delete[] DArr[i]; // освобождаем память, выделенную под массив int,
delete[] DArr; // освобождаем память, выделенную под массив указателей на строки
} while (key != ESC);
return 0;
}
Результат работы программы: