Int main(int argc, char* argv[])
{
int Ar[N][N];
short i, j; // текущие индексы
int k;
int **DArr;
printf("---------- Variables addresses ------------\n");
printf(" i = %p (%u)\n", &i, &i);
printf(" j = %p (%u)\n", &j, &j);
printf(" k = %p (%u)\n", &k, &k);
printf("------ Arrays addresses---------\n");
printf(" Ar = %p (%u)\n", Ar, Ar); // Статический массив
for (i=0; i<N; i++)
printf(" Ar[%d] = %p (%u), address DArr[%d] = %p (%u)\n", i, Ar[i], Ar[i], i, &Ar[i], &Ar[i]);
printf("------------------------------------\n");
k = 1;
for (i = 0; i < N; i++) // перебор строк
for (j = 0; j < N; j++) // перебор столбцов
Ar[i][j] = k++; // или i * N + j + 1;
printf("\n----- Data by indexes ------\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
printf("%3d",Ar[i][j]); // Обращение к элементу массива по индексам
printf("\n");
}
printf("\n----- Data by pointers ------\n");
for (k = 0; k < N * N; k++) // if (!(j % N)) printf("\n");
printf("%3d", *(Ar[0] + k)); // Обращение к элементу массива по указателю,
// начиная с Ar[0] (или &Ar[0][0])
printf("\n");
getch();
printf("===================================\n"); // Динамический массив
DArr = new int*[N]; // Динамически выделяем память под массив указателей на строки
for (i = 0; i < N; i++) // Затем для каждой строки
DArr[i] = new int[N]; // динамически выделяем память под массив int
printf ("---------- Arrays addresses ------------\n");
printf(" DArr = %p (%u)\n", DArr, DArr);
for (i = 0; i < N; i++)
printf(" DArr[%d] = %p (%u), address DArr[%d] = %p (%u)\n",
i, DArr[i], DArr[i], i, &DArr[i], &DArr[i]);
printf("------------------------------------\n");
for (i = 0; i < N; i++) // перебор строк
for (j = 0; j < N; j++) // перебор столбцов
DArr[i][j] = i * N + j + 1;
printf("\n----- Data by indexes ------\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
printf("%3d", DArr[i][j]); // Обращение к элементу массива по индексам
printf("\n");
}
printf("\n----- Data by pointers ------\n");
for (k = 0; k < N * N; k++)
printf("%3d", *(DArr[0] + k)); // Обращение к элементу массива по указателю,
// начиная с DArr[0] (или &DArr[0][0])
printf("\n");
getch();
for (i = 0; i < N; i++) // Для каждой строки
delete[] DArr[i]; // освобождаем память, выделенную под массив int,
delete[] DArr; // освобождаем память, выделенную под массив указателей на строки
return 0;
}
Результат работы программы:
В статическим массиве адреса строк лежат с интервалом 20 байт (N * sizeof(int) ), а в динамическом не так, поэтому последовательное считывание элементов массива дает ошибку.
Чтобы избежать ошибок лучше выделять память под одномерный массив размером NxN, который можно интерпретировать как последовательность из N строк по N элементов в каждой. А к элементам массива обращаться с помощью индекса i * N + j или через указатель.
Пример 4. Одномерный динамический массив как двумерный
#define N 5 // размер массива