19.09. ? razlika između dvodimenzionalnog polja i niza nizova
Razlika između dvodimenzionalnog polja i niza nizova može da se objasni na nekoliko nivoa: strukturalno, načinom alociranja memorije i fleksibilnošću.
1. Dvodimenzionalno polje
-
To je kontinuirani blok memorije koji sadrži sve elemente.
-
Svi redovi imaju isti broj kolona.
-
Primer u C#:
int[,] matrica = new int[3, 4]; // 3 reda, 4 kolone
matrica[0, 0] = 1;
-
Karakteristike:
-
Fiksna veličina reda i kolone.
-
Brži pristup elementima jer je memorija linearno alocirana.
-
Sintaksa pristupa:
matrica[i,j].
-
2. Niz nizova (jagged array)
-
To je niz čiji su elementi drugi nizovi.
-
Redovi mogu imati različite dužine.
-
Primer u C#:
int[][] nizNizova = new int[3][];
nizNizova[0] = new int[2]; // prvi red ima 2 kolone
nizNizova[1] = new int[4]; // drugi red ima 4 kolone
nizNizova[2] = new int[3]; // treći red ima 3 kolone
nizNizova[0][0] = 5;
-
Karakteristike:
-
Svaki red može imati različitu dužinu.
-
Memorija se alocira po redovima, nije nužno kontinuirana.
-
Pristup elementima:
nizNizova[i][j].
-
3. Uporedna tabela
| Osobina | Dvodimenzionalno polje | Niz nizova |
|---|---|---|
| Veličina kolona po redu | Fiksna, ista za sve redove | Može biti različita |
| Alokacija memorije | Kontinuirana | Po redovima (nije kontinuirana) |
| Sintaksa pristupa | matrica[i,j] |
nizNizova[i][j] |
| Fleksibilnost | Niska | Visoka (različite dužine redova) |
| Performanse | Brži pristup | Malo sporiji zbog dodatnog nivoa referenci |
Ovo može da se uradi u C-u, ali način implementacije je malo drugačiji nego u C#:
*** način implementacije u jeziku C - komplikacija zar ne ? ***
1. Dvodimenzionalno polje u C-u
U C-u se koristi sintaksa sa dve dimenzije:
#include <stdio.h>
int main() {
int matrica[3][4]; // 3 reda, 4 kolone
matrica[0][0] = 1;
matrica[1][2] = 5;
printf("%d\n", matrica[0][0]);
printf("%d\n", matrica[1][2]);
return 0;
}
-
Svi redovi imaju istu dužinu.
-
Memorija je kontinuirana (redovi jedan za drugim u memoriji).
2. Niz nizova (jagged array) u C-u
C nema ugrađeni "niz nizova" kao C#. Umesto toga, koristi se niz pokazivača:
#include <stdio.h>
#include <stdlib.h>
int main() {
int* nizNizova[3]; // niz 3 pokazivača na int
nizNizova[0] = (int*)malloc(2 * sizeof(int)); // prvi red 2 kolone
nizNizova[1] = (int*)malloc(4 * sizeof(int)); // drugi red 4 kolone
nizNizova[2] = (int*)malloc(3 * sizeof(int)); // treći red 3 kolone
nizNizova[0][0] = 5;
nizNizova[1][3] = 10;
printf("%d\n", nizNizova[0][0]);
printf("%d\n", nizNizova[1][3]);
// oslobodi memoriju
free(nizNizova[0]);
free(nizNizova[1]);
free(nizNizova[2]);
return 0;
}
-
Svaki red može imati različitu dužinu.
-
Memorija se alocira po redovima, nije nužno kontinuirana.
-
Moramo ručno osloboditi memoriju koristeći
free().
U nastavku je primer ispisa dvodimenzionalnog polja i niza nizova u C#:
using System;
class Program
{
static void Main()
{
int[,] matrica = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
Console.WriteLine("Dvodimenzionalno polje:");
for (int i = 0; i < matrica.GetLength(0); i++) // broj redova
{
for (int j = 0; j < matrica.GetLength(1); j++) // broj kolona
{
Console.Write(matrica[i, j] + " ");
}
Console.WriteLine();
}
}
}
Rezultat:
Dvodimenzionalno polje:
1 2 3
4 5 6
7 8 9
using System;
class Program
{
static void Main()
{
int[][] nizNizova = new int[3][];
nizNizova[0] = new int[] {1, 2};
nizNizova[1] = new int[] {3, 4, 5};
nizNizova[2] = new int[] {6};
Console.WriteLine("Niz nizova:");
for (int i = 0; i < nizNizova.Length; i++)
{
for (int j = 0; j < nizNizova[i].Length; j++)
{
Console.Write(nizNizova[i][j] + " ");
}
Console.WriteLine();
}
}
}
Rezultat:
Niz nizova:
1 2
3 4 5
6