logo

Daugiamačiai masyvai C

Būtina sąlyga: Masyvai C

Daugiamatis masyvas gali būti vadinamas masyvu, kuriame saugomi vienarūšiai duomenys lentelės pavidalu. Duomenys daugiamačiuose masyvuose paprastai saugomi atmintyje eilučių pagrindine tvarka.



The bendroji N matmenų matricų deklaravimo forma parodyta žemiau.

Sintaksė:

data_type array_name[size1][size2]....[sizeN];>
  • duomenų tipas : masyve saugomų duomenų tipas.
  • masyvo_pavadinimas : masyvo pavadinimas.
  • dydis1, dydis2,…, dydisN : kiekvieno matmens dydis.

Pavyzdžiai :



tvarka atsitiktine tvarka sql
  Two dimensional array:   int two_d[10][20];   Three dimensional array:   int three_d[10][20][30];>

Daugiamačių masyvų dydis:

Bendras elementų, kuriuos galima saugoti daugiamačiame masyve, skaičius gali būti apskaičiuojamas padauginus visų matmenų dydį.
Pavyzdžiui:

  • Masyvas int x[10][20] gali saugoti viso (10*20) = 200 elementų.
  • Panašiai masyvas int x[5][10][20] gali saugoti iš viso (5*10*20) = 1000 elementų.

Norėdami gauti masyvo dydį baitais, padauginame vieno elemento dydį iš viso masyvo elementų skaičiaus.
Pavyzdžiui:

  • Masyvo dydis int x[10][20] = 10 * 20 * 4 = 800 baitų. (kur int = 4 baitai)
  • Panašiai, dydis int x[5][10][20] = 5 * 10 * 20 * 4 = 4000 baitų. (kur int = 4 baitai)

Dažniausiai naudojamos daugiamačio masyvo formos yra šios:



  1. Dviejų dimensijų masyvas
  2. Trimatis masyvas

Dvimatis masyvas C

A dvimatis masyvas arba 2D masyvas C yra paprasčiausia daugiamačio masyvo forma. Galime įsivaizduoti dvimatį masyvą kaip vienmačių masyvų, išdėstytų vienas po kito, masyvą, sudarantį lentelę su „x“ eilėmis ir „y“ stulpeliais, kur eilutės numeris svyruoja nuo 0 iki (x-1) ir stulpelio numeris. svyruoja nuo 0 iki (y-1).

grafinis dvimačio masyvo vaizdas

Dvimačio 3 x 3 dydžio masyvo grafinis vaizdavimas

Dvimačio masyvo deklaracija C

Pagrindinė 2D masyvo deklaravimo forma su x eilutes ir ir C stulpeliai rodomi žemiau.

Sintaksė:

data_type array_name[x][y];>

kur,

  • duomenų tipas: Kiekviename elemente saugomų duomenų tipas.
  • masyvo_pavadinimas: masyvo pavadinimas
  • x: Eilučių skaičius.
  • ir: Stulpelių skaičius.

Dvimatį sveikųjų skaičių masyvą galime paskelbti „x“ su 10 eilučių ir 20 stulpelių kaip:

Pavyzdys:

int x[10][20];>

Pastaba: Šio tipo deklaracijoje masyvo atmintis yra paskirstyta krūvoje, o masyvo dydis turėtų būti žinomas kompiliavimo metu, t. y. masyvo dydis yra fiksuotas. Mes taip pat galime sukurti masyvą dinamiškai C, naudodami minėtus metodus čia.

Dvimačių masyvų inicijavimas C

Įvairūs būdai, kuriais galima inicijuoti 2D masyvą, yra šie:

  1. Initializatorių sąrašo naudojimas
  2. Naudojant kilpas

1. 2D masyvo inicijavimas naudojant inicijavimo sąrašą

Galime inicijuoti 2D masyvą C, naudodami inicijavimo sąrašą, kaip parodyta toliau pateiktame pavyzdyje.

Pirmasis metodas:

int x[3][4] = {0, 1 ,2 ,3 ,4 , 5 , 6 , 7 , 8 , 9 , 10 , 11}>

Aukščiau pateiktame masyve yra 3 eilutės ir 4 stulpeliai. Elementai petnešose iš kairės į dešinę saugomi lentelėje taip pat iš kairės į dešinę. Elementai masyve bus pildomi eilės tvarka: pirmi 4 elementai iš kairės bus užpildyti pirmoje eilutėje, kiti 4 elementai antroje ir t.t.

Antrasis metodas (geresnis) :

int x[3][4] = {{0,1,2,3}, {4,5,6,7}, {8,9,10,11}};>

Šio tipo inicijavimui naudojami įdėtieji skliaustai. Kiekvienas vidinių petnešėlių rinkinys reiškia vieną eilutę. Pirmiau pateiktame pavyzdyje iš viso yra trys eilutės, taigi yra trys vidinių petnešų rinkiniai. Šio metodo pranašumas yra tai, kad jį lengviau suprasti.

Pastaba: Elementų skaičius iniciatorių sąraše visada turi būti mažesnis arba lygus bendram elementų skaičiui masyve.

Taip pat galime deklaruoti masyvą neapibrėždami eilutės dydžio, jei naudojame sąrašo inicijavimą. Šiuo atveju kompiliatorius automatiškai nustatys masyvo dydį:

data_type array_name[][y] = {...} ;>

Vis dar privaloma apibrėžti stulpelių skaičių.

2. 2D masyvo inicijavimas naudojant kilpas

Mes galime naudoti bet kurią C kilpą, kad inicijuotų kiekvieną 2D masyvo narį po vieną, kaip parodyta toliau pateiktame pavyzdyje.

Pavyzdys:

int x[3][4]; for(int i = 0; i <3; i++){ for(int j = 0; j < 4; j++){ x[i][j] = i + j; } }>

Šis metodas yra naudingas, kai kiekvieno elemento reikšmės turi tam tikrą nuoseklų ryšį.

Prieiga prie dvimačių masyvų elementų C

2D masyvų elementai pasiekiami naudojant eilučių ir stulpelių indeksus. Kiekvienas 2D masyvo elementas gali būti nurodytas taip:

lygus metodui java

Sintaksė:

array_name[i][j]>

kur,

  • aš: Eilutės indeksas.
  • j: Stulpelio indeksas.

Pavyzdys:

int x[2][1];>

Aukščiau pateiktas pavyzdys vaizduoja elementą, esantį trečioje eilutėje ir antrame stulpelyje.

Pastaba : Masyvuose, jei masyvo dydis yra N. Jo indeksas bus nuo 0 iki N-1. Todėl 2 eilutės indeksui eilutės numeris yra 2+1 = 3. Norėdami išvesti visus dvimačio masyvo elementus, galime naudoti įdėtą kilpoms. Mums reikės dviejų ' dėl ‘ kilpos. Viena eilėms pereiti, kita stulpeliams.

Norėdami spausdinti visą masyvą, kiekvieną elementą pasiekiame po vieną naudodami kilpas. Perėjimo tvarka gali būti pagrindinė eilutė arba pagrindinė stulpelio tvarka, priklausomai nuo reikalavimo. Toliau pateiktame pavyzdyje parodytas 2D masyvo eilučių pagrindinis perėjimas.

Pavyzdys:

C




// C Program to print the elements of a> // Two-Dimensional array> #include> int> main(>void>)> {> >// an array with 3 rows and 2 columns.> >int> x[3][2] = { { 0, 1 }, { 2, 3 }, { 4, 5 } };> >// output each array element's value> >for> (>int> i = 0; i <3; i++) {> >for> (>int> j = 0; j <2; j++) {> >printf>(>'Element at x[%i][%i]: '>, i, j);> >printf>(>'%d '>, x[i][j]);> >}> >}> >return> (0);> }> // This code is contributed by sarajadhav12052009>

>

>

Išvestis

Element at x[0][0]: 0 Element at x[0][1]: 1 Element at x[1][0]: 2 Element at x[1][1]: 3 Element at x[2][0]: 4 Element at x[2][1]: 5>

Laiko sudėtingumas: O (N*M) , kur N (čia 3) ir M (čia 2) yra atitinkamai eilučių ir stulpelių skaičiai.

Erdvės sudėtingumas: O(1)

Kaip 2D masyvai saugomi atmintyje?

2-D masyvo elementai turi būti saugomi greta atmintyje. Kadangi kompiuteriai turi linijinius atminties adresus, 2-D matricos turi būti tiesinės, kad būtų galima jas saugoti. Yra du būdai, kaip pasiekti masyvo elementų linijavimą:

  • Eilutės pagrindinis- Linearizacijos technika pirmiausia saugo pirmąją masyvo eilutę, tada antrą masyvo eilutę, tada trečią eilutę ir pan. (t. y. elementai saugomi pagal eilutes. Eilutės išvardijamos pagal stulpelius)
  • Kolona-major – Ši linijavimo technika pirmiausia išsaugo pirmąjį stulpelį, tada antrą stulpelį, tada trečią stulpelį ir taip toliau, t. y. (elementai saugomi stulpeliais. Stulpeliai išvardijami pagal eilutes)

Kompiuteris neseka visų masyvo elementų adresų, bet seka bazinį adresą (pačio pirmojo elemento pradžios adresą) ir prireikus apskaičiuoja elementų adresus.

Norėdami sužinoti daugiau, skaitykite straipsnį - 1-D, 2-D ir 3-D elemento adreso apskaičiavimas

Trimatis masyvas C

A Trimatis masyvas arba 3D masyvas C yra dvimačių masyvų rinkinys. Jį galima vizualizuoti kaip keletą 2D matricų, sukrautų viena ant kitos.

grafinis trimačio masyvo vaizdas

3 x 3 x 3 dydžio trimačio masyvo grafinis vaizdavimas

Trimačio masyvo deklaracija C

3D masyvą galime deklaruoti su x 2D matricos, kurių kiekvienas turi ir eilutes ir Su stulpelius naudodami toliau pateiktą sintaksę.

Sintaksė:

data_type array_name[x][y][z];>
  • duomenų tipas: Kiekviename elemente saugomų duomenų tipas.
  • masyvo_pavadinimas: masyvo pavadinimas
  • x: 2D matricų skaičius.
  • ir: Eilučių skaičius kiekviename 2D masyve.
  • Su: Stulpelių skaičius kiekviename 2D masyve.

Pavyzdys:

int array[3][3][3];>

Trimačio masyvo inicijavimas C

3D matricos inicijavimas yra toks pat kaip ir 2D matricų. Skirtumas yra tas, kad didėjant matmenų skaičiui, padidės ir įdėtų breketų skaičius.

C 3D masyvą galima inicijuoti naudojant:

  1. Iniciatorių sąrašas
  2. Kilpos

3D masyvo inicijavimas naudojant inicijavimo sąrašą

1 būdas :

int x[2][3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23};>

2 metodas (geresnis) :

int x[2][3][4] =   {   { {0,1,2,3}, {4,5,6,7}, {8,9,10,11} },  { {12,13,14,15}, {16,17,18,19}, {20,21,22,23} }  };>

Vėlgi, kaip ir 2D matricas, mes taip pat galime deklaruoti 3D matricas nenurodydami pirmųjų matmenų dydžio, jei inicijavimui naudojame inicijavimo sąrašą. Kompiliatorius automatiškai nustatys pirmojo matmens dydį. Tačiau vis tiek turime nurodyti likusius matmenis.

data_type array_name[][y][z] = {....};>

3D masyvo inicijavimas naudojant kilpas

Jis taip pat panašus į 2D masyvą su dar viena įdėta kilpa, skirta pasiekti dar vieną dimensiją.

int x[2][3][4]; for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { for (int k=0; k<4; k++) { x[i][j][k] = (some_value); } } }>

Prieiga prie elementų trimačio masyvo C

Prieiga prie elementų 3D masyvuose taip pat yra panaši į 2D masyvų prieigą. Skirtumas yra tas, kad turime naudoti tris kilpas, o ne dvi kilpas vienam papildomam matmeniui 3D masyvuose.

Sintaksė:

array_name[x][y][z]>

kur,

  • x: 2D masyvo indeksas.
  • ir: Tos 2D masyvo eilutės indeksas.
  • Su: To 2D masyvo stulpelio indeksas.

C




// C program to print elements of Three-Dimensional Array> #include> int> main(>void>)> {> >// initializing the 3-dimensional array> >int> x[2][3][2] = { { { 0, 1 }, { 2, 3 }, { 4, 5 } },> >{ { 6, 7 }, { 8, 9 }, { 10, 11 } } };> >// output each element's value> >for> (>int> i = 0; i <2; ++i) {> >for> (>int> j = 0; j <3; ++j) {> >for> (>int> k = 0; k <2; ++k) {> >printf>(>'Element at x[%i][%i][%i] = %d '>, i,> >j, k, x[i][j][k]);> >}> >}> >}> >return> (0);> }>

pervardyti Linux aplanką

>

>

Išvestis

Element at x[0][0][0] = 0 Element at x[0][0][1] = 1 Element at x[0][1][0] = 2 Element at x[0][1][1] = 3 Element at x[0][2][0] = 4 Element at x[0][2][1] = 5 Element at x[1][0][0] = 6 Element at x[1][0][1] = 7 Element at x[1][1][0] = 8 Element at x[1][1][1] = 9 Element at x[1][2][0] = 10 Element at x[1][2][1] = 11>

Panašiais būdais galime sukurti masyvus su bet kokiu matmenų skaičiumi. Tačiau sudėtingumas taip pat didėja didėjant matmenų skaičiui. Dažniausiai naudojamas daugiamatis masyvas yra dvimatis masyvas.

Masyvai taip pat yra glaudžiai susiję su rodyklėmis C kalba. Norėdami sužinoti daugiau apie masyvų ryšį su rodyklėmis C, žr tai straipsnis.