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

7.3. Динамические массивы

При работе с массивами память для размещения их элементов может выделяться динамически. Для одномерных массивов доступ к элементам осуществляется как обычно: по номеру индекса элементов.

В случае использования двумерных массивов (матриц) их элементы располагаются в памяти в виде линейного массива. При этом доступ к отдельному элементу осуществляется не по номеру строки и столбца, а также как и для одномерных массивов - по номеру элемента. Таким образом, программист сам должен контролировать правильность доступа к нужному элементу массива.

Чтобы работать с матрицами в естественной форме, целесообразно выделять память с использованием двойных указателей. Рассмотрим фрагмент программы:

a = (int**) malloc(m*sizeof (int*));

for (i = 0: i <m; i++)

a[i] = (int*)malloc(n*sizeof (int));

В результате выполнения первой строки будет выделена память для размещения m указателей на данное типа int, а переменной а будет присвоено значение адреса начала выделенной области. В результате выполнения цикла for будет выделена память для размещения m*n элементов типа int в соответствии со следующей схемой:

1-й этап 2-й этап (цикл for)

int **a -> int*a[0] ->a[0] [0] a[0] [1] a[0] [2] … a[0] [n]

int* a[1] -> a[1] [0] a[1] [1] a[1] [2] … a[1] [n]

int* a[2] -> a[2] [0] a[2] [1] a[2] [2] … a[2] [n]

int* a[m] -> a[m][0] a[m][1] a[m][2] …a[m] [n]

Таким образом, в памяти будет выделена область для размещения элементов матрицы размером m*n, а доступ к отдельному элементу будет осуществляться по индексу строки и столбца.

Пример 7.3: Работа с динамическими массивами

#include<stdio.h>

#include<conio.h>

#include<alloc.h>

int** input (int, int); //Функция ввода матрицы

void output (int**, int, int); // Функция вывода матрицы

void making (int**, int, int);

void main(void)

{

int m,n;

int** p;

clrscr( );

puts(“Введите размер исходной матрицы “);

printf(“число строк = “);

scant(“%d”,&m);

printf(“число столбцов = “);

scanf(“%d”,&n);

p = input(m,n);

making(p,m,n);

output (p,m,n);

free(p);

getch( );

}

int** input(int m, int n)

{

int i, j ;

int **a;

a=(int**)malloc(m*sizeof(int*));

for(i=0; i<m; i++)

{

a[i]=(int*)malloc(n*sizeof(int));

for(j=0; j<n; j++)

{

a[i] [j] =0;

}

}

for(i=0; i<m; i++)

for(j=0; j<n; j++)

{

printf(“\nВведите А(%1d,%1d) элемент матрицы : “, i+1, j+1);

scanf(“%d”, &a[i] [j]);

}

return a;

}

/*Функция заменяет элементы с четной суммой индексов на противоположные */

void making(int **a, int m, int n)

{

int i, j;

for (i=0; i<m; i++)

for(j=0; j<n; j++)

if((i=j)%2 = = 0)

a[i] [j] = -a[i] [j];

}

void output(int **z, int m, int n)

{

int i,j;

printf(“\nРезультирующая матрица \n”);

for(i=0; i<m; i++)

{

for(j=0; j<n; j++)

printf(“%8d”, z[i] [j]);

printf(“\n”);

}

}