Динамичке матрице

Меморија, без обзира да ли се додељује статички или динамички, је по својој структури једнодимензиони низ узастопних меморијских ћелија. Величина једне меморијске ћелије зависи од типа података, а број тих ћелија представља величину низа. Због тога је рад са једнодимензионим динамичким низовима врло једноставан – врло лако се успоставља веза између елемената низа и одговарајућих меморијских ћелија.

Са друге стране рад са вишедимензионим низовима захтева нешто сложенији приступ.

Постоје два основна начина за реализацију динамичких матрица:
1) матрица помоћу низа показивача
2) матрица помоћу показивача на показивач

1) матрица помоћу низа показивача

Први начин јесте да матрицу дефинишемо као низ низова. У том случају користимо показиваче, тако да компонентни низови буду међусобно независно смештени у меморији. У ту сврху треба да се образује низ показивача од којих сваки показује на један од компонентних низова.

Низ а је низ показивача (int *[]) па је a[i] адреса i-тог низа/врсте. Адреса елемента aij матрице која се представља на овај начин је a[i]+j, а вредност тог елемента *(a[i]+j)

матрица помоћу низа показивача

матрица помоћу низа показивача

Разлику у ова два начина дефинисања динамичких матрица приказаћемо на примеру програма који треба да исписује матрицу елемената који се израчунавају по формули: aij=100*i*j

#include <stdio.h>
#include<stdlib.h>

int main()
{
	int *a[20]; /* definise se niz od 20 pokazivaca na celobrojne podatke. Za pokazivace prostor je dodeljen staticki, ali za podatke prostor se dodeljuje dinamicki */
	int m,n,i,j,k;
	printf("unesi dimenzije matrice");scanf("%d%d",&m,&n);
	for (i=0; i<m; i++)
	{
		a[i]=malloc(n*sizeof(int)); /* dodeljuje se prostor za nizove. a[i] je adresa dodeljenog prostora */
		if (a[i] == NULL)
		{
			printf("Greska prilikom alokacije memorije!\n"); /* neophodno je, nakon primene funkcije malloc, proveriti da li je memorija uspesno dodeljena, kako bi se mnoglo nastaviti sa izvrsavanjem programa. Ako memorija nije dodeljena tada se prijavljuje poruka o gresci i prekida izvrsavanje programa */
			for(k=0;k<i;k++)
			free(a[k]); /* ukoliko nije dodeljena memorija za i-tu vrstu, moramo osloboditi memoriju za sve prethodno dodeljene vrste! */
			exit(1);
		}
		for(j=0;j<n;j++) printf("%d\t",*(a[i]+j)=100*i*j); /* mogli su se koristiti i standardni izrazi za elemente matrice (a[i][j]), ali u ovom primeru hteli smo da pokazemo na koji nacin se formira adresa odgovarajuceg elementa! */
		printf("\n");
	}
	for(i=0;i<m;i++)free(a[i]);
	return 0;
}

Овако дефинисана матрица није права динамичка матрица јер је низ показивача на врсте матрице дефинисан статички.

2) матрица помоћу показивача на показивач

Други начин представља формирање потпуно динамичке матрице, а то се реализује тако што се за приступ матрици статички предвиђа само један скаларни показивач, а низ показивача на врсте матрице ствара се динамички, у тренутку извршавања програма

матрица помоћу показивача на показивач

матрица помоћу показивача на показивач

#include <stdio.h>
#include<stdlib.h>

int main()
{
	int **a; /* pokazivac na pokazivac na celobrojne podatke */
	int m,n,i,j,k;
	printf("unesi dimenzije matrice");scanf("%d%d",&m,&n);
	a=malloc(m*sizeof(int*)); /* dodela prostora za niz od m pokazivaca – broj vrsta matrice */
	if (a == NULL) 
	{
		printf("Greska prilikom alokacije memorije!\n");
		exit(1);
	}
	for (i=0; i<m; i++)
	{
		*(a+i)=malloc(n*sizeof(int));
		if (*(a+i) == NULL)
		{
			printf("Greska prilikom alokacije memorije!\n");
			for(k=0;k<i;k++)
			free(a[k]);
			exit(1);
		}
		for(j=0;j<n;j++) printf("%d\t",*(*(a+i)+j)=100*i*j);/* i ovde smo mogli koristiti standardne izraze za elemente matrice (a[i][j]), ali i ovde nam je namera da prikazemo nacin na koji se formira adresa odgovarajuceg elementa */
		printf("\n");
	}
	for(i=0;i<m;i++)free(*(a+i)); /* oslobadja se memorija dodeljena vrstama, i to vrsta po vrsta */
	free(a); /* oslobadja se prostor dodeljen nizu pokazivaca */
	return 0;
}

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се /  Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се /  Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се /  Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се /  Промени )

Повезивање са %s