Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornaya_rabota_7.doc
Скачиваний:
1
Добавлен:
12.07.2019
Размер:
135.68 Кб
Скачать

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 // размер массива

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]