Többdimenziós tömbök c

Az első cikk leírt munkamódszerek a legegyszerűbb típusú tömbök - egydimenziós (lineáris) tömb. Ebben a második cikkben fogjuk vizsgálni a többdimenziós tömböket. Alapvetően ez lesz a kétdimenziós tömböket. De ezek a példák könnyen extrapolálni tömbök minden dimenzióban. Ahogy az első cikk, csak azokat a tömbök C / C ++ stílusú használata nélkül STL lehetőségeket.

klasszikus a műfaj

Ha kinyitjuk a klasszikus munka «C programozási nyelv” Brian Kernighan és Dennis Ritchie. Olvastam, hogy a „C-ben van a lehetőséget, hogy a többdimenziós tömb téglalap, bár a gyakorlatban használják őket sokkal ritkábban, mint tömbök mutatók.” C ++ szinte teljesen örökölt munka többdimenziós tömbök, elődje.

Meghatározása automatikus többdimenziós tömbök

Ebben a részben, én néha használják a „mátrix” szinonimájaként a „kétdimenziós tömböt.” négyszögletes kétdimenziós tömb számok valóban végrehajtja a matematikai fogalmát „mátrix” C / C ++. Azonban, általában, egy kétdimenziós tömb - a koncepció sokkal szélesebb, mint a mátrix, mivel nem lehet téglalap alakú, nem numerikus.

Meghatározása automatikus többdimenziós tömbök majdnem azonos a meghatározását egydimenziós tömbök (amit tárgyalt az első cikk), kivéve, hogy egy méret lehet több:

Ez a példa definiál egy kétdimenziós tömböt 3 sorból és 5 int típusú értékek minden sorban. Összesen 15 int értéket.

A második példa definiál egy háromdimenziós tömb, amely három mátrixok, amelyek mindegyike áll 5 sor két int típusú értékek minden sorban.

Magától értetődik, hogy az adatok típusát tartalmazott egy többdimenziós tömbben lehet bármilyen.

Az «C-array” fogják használni során további expozíció, hogy az ilyen többdimenziós tömbök. ami megkülönbözteti őket a más típusú tömbök.

inicializálás

Statikus (fordítási időben meghatározható) kezdeti értékeket a C-tömb sorrendjében adja méretben (index) a meződefiníciónál. Minden szinten (index), kivéve a legfiatalabb, egy többdimenziós tömb egy pár távtartóval. Az értékek a legfiatalabb az index vesszővel vannak elválasztva:

A bemutatott példában egy téglalap alakú statikus inicializálása a tömb. A teljes listát a kezdeti értékeket zárójelek. Az értékeket minden egyes, a 3 sorok vannak zárva egy pár zárójelek között, az értékek az egyes 5 oszlopok az egyes sorban vannak felsorolva vesszővel elválasztva.

Ha van egy inicializáló, a bal oldal a tömb lehet hagyni. Ebben az esetben, a fordító fogja meghatározni a méretét alapján az inicializálás listán.

Tömb feltöltése értékek

A többdimenziós tömb lakott a értékekhez a beágyazott hurok. És, mint általában, a ciklusok száma megegyezik a mérete a tömb:

Ebben a példában minden egyes tömb elem úgy van beállítva, az első számjegye, amely jelzi a sor számát, és a második szám - hasáb számot ezt az értéket (számozott 1).

Nyomtató tömb értékeit a konzol

Folytatva az előző példát, akkor írj:

Ennek eredményeként a következő kimenetet a konzolon:

írhatunk kódot háromdimenziós tömb, ugyanazokkal a módszerekkel:

Itt értéket rendelni a tömb elem és a kimenetet a konzol ciklusok bekövetkezik egy csoportban.

Hely a memóriában

A többdimenziós C-tömb van allokálva egy blokk szükséges memória mérete: razmer_massiva1 razmer_massiva2 * *. * Razmer_massivaN * sizeof (tip_elementa_massiva).

Az értékek sorba vannak rendezve. A bal szélső index változik a leglassabban. Ie háromdimenziós elrendezést első esetben helyezzük értékeket az első (0 index) a mátrix, akkor a második, stb Az értékeket a mátrixok vannak elrendezve soronként (lásd. A statikus inicializálása a tömb fent).

A név (ID) a többdimenziós C-tömb egy mutatót az első eleme a tömb (valamint egydimenziós tömbök)

Ha a kód az utolsó példa, egy kis változás:

meg egy töréspont a visszatérő és keresse a debugger memória kiosztott alatt változó ed rendű. akkor látható, hogy az értékek található egy memória, egymás után növekszik:

Az utolsó töredéke hozzáférést biztosít az értékek a két dimenziós tömb, mint egy egydimenziós tömböt. Civilizált megoldás valósul meg unió.

A két fent említett példák, ebből következik, hogy a munka egy kétdimenziós vagy többdimenziós tömbben (által meghatározott egy magasabb absztrakciós szinten) műszakilag lehetséges, hogy gondoskodjon egy egydimenziós tömb megfelelő mérete:

Ez a technika elég gyakori. Előnye az, hogy a tömb ed rendű [DIM1 * dim2] nem kell visszatéríteni automatikusan. Meg lehet kiválasztani és dinamikusan. De logikusan úgy tekintenek, mint a C-tömb.

natív ikrek

Most tekintsünk egy állást „dinamikus” többdimenziós tömböket, azaz a tömbök, memória, amely dinamikusan.

Létrehozása és elpusztítja a dinamikus többdimenziós tömbök

Általában munka ilyen tömbök a következő:

(1) eléréséhez egy kétdimenziós tömböt nyilvánítják ed rendű változó típusú mutató egy mutató egy típusú (ebben az esetben, egy mutatót egy mutató egy int).

(2) A változó kezdeti értékét a szolgáltató új. amely memóriát egy sor mutató int.

(3) Az egyes hurok eleme a tömb mutató inicializált szereplő új. amely rendelkezésre bocsátja memória egy int tömb.

Felszabadítása következik be szigorúan fordított sorrendben: először elpusztult tömbök int. majd elpusztult egy sor mutató.

A dinamikus többdimenziós tömb szintaxis azonos dolgozni többdimenziós C-tömb.

Példa kódját a háromdimenziós tömb:

Ha a kutya matatott

A dinamikus többdimenziós tömb szintaxis azonos dolgozni többdimenziós C-tömb. (Idézve az előző fejezetben.) Szintaktikailag igen - de ezek között tömbök van alapvető különbség, ami kezdődő programozók gyakran elfelejti.

Először is, a különböző mennyiségű memória elkülönített dinamikus tömb.

Ha számolunk, hogy mennyi memória kerül kiosztásra kétdimenziós tömb a fenti példában, kapjuk: első operátor az új memóriát 3 mutatók a második szereplő új memóriát ciklus háromszor 5 int típusú elemeket. Ie Előfordul, hogy a lefoglalt memória az int típusú értékek 15 és 3-án az int típusú mutató értékeket. A C-fordító a tömb már kiosztott csak 15 memóriában int értéket. (Mindenféle szintező és egyéb optimalizálási nem számít!)

Másodszor, a memória mennyiségét a dinamikus tömb nem folytonos. Következésképpen hack №1 (kezelés kétdimenziós tömbök egydimenziós) nem fog működni.

Harmadszor, az átadást a többdimenziós tömböket a funkciókhoz és a velük dolgozó más lesz a dinamikus tömbök és a C-tömbök.

Dinamikus többdimenziós tömb van megvalósítva egy sor mutató tömbök értékeit, ami viszont szintén lehetnek mutatókat tömböket. Az utolsó láncszem ebben a láncban mindig egy tömb értékeit a cél típusát.

Dinamikus többdimenziós tömb nem a C-tömb.

Paradox módon, amely a legközelebb van ezen a nem őshonos rodstvennichki ikrek hack №2, végrehajtja a műveletet egy többdimenziós tömb olyan egydimenziós tömböt (lásd. Keki fejezet). Mindhárom fent említett különbségek lényegtelenek számára.

Érdemes megjegyezni, hogy egy sor mutató tömbök - rugalmasabb szerkezetű, mint a C-dimenziós tömb. Például egy sor mutatókat a méret a tömb tömbök különböző lehet, vagy valamilyen tömb lehet jelen. A leggyakoribb példa egy „folytonos vonalak”, azaz, tömb mutatókat, hogy írja char tömbök (például - lásd a következő szakaszt.).

Ismét a biztonsági

A fentiekből is világosan meg kell különböztetni a többdimenziós tömbök C-típusú

A tömb mutató tömböket.

Néha külső különbségek elhanyagolhatóak. Például, a C-karakterlánc - egy egydimenziós tömb elemeinek típusa char. lezáró null bájt. Hogyan kell végrehajtani egy tömböt?

Ez - egy példa a meghatározása és inicializálására egy kétdimenziós C-tömb

És itt meg van határozva, és inicializálja egydimenziós (!) Tömbje mutatókat tömbök char elemek.

És végül még egy figyelmeztetés.

Mivel többdimenziós tömböket C-általában elfoglalják nagy mennyiségű memóriát, akkor kell fokozott óvatossággal nyilvánító funkcióit, beleértve a main (). És óvatosan az n-edik fokozatot rekurzív függvények. Könnyen kap egy halom túlcsordulás, és ennek eredményeként, egy abnormális programkilépés.

Többdimenziós tömbök, ha dolgozik, funkciói

Mivel többdimenziós C-tömbök és többdimenziós dinamikus tömböket - két nagyon különböző típusú adatokat, még ha dolgozik, funkciói megközelítés más lesz.

Az átviteli függvény a többdimenziós C-tömb

Funkció fogadó C-tömb, mint egy paraméter a következőképpen néznek ki:

Forma (1) - a leggyakoribb.

Forma (2). Továbbítása során többdimenziós C-tömb funkció nem adja meg a hosszát a bal szélső dimenzió. Compiler kiszámításához elérjen egy tömb, ez az információ nem szükséges.

C visszacsapó többdimenziós tömb funkció eredményeként hagyományos eszközökkel lehetetlen.

Az átviteli függvény egy többdimenziós dinamikus tömb

Mivel a többdimenziós dinamikus tömb van megvalósítva egydimenziós tömb mutató, majd rendre, és amikor dolgozik funkciókat használja ugyanazt a megközelítést, mint az egydimenziós tömb, ahogy az az első cikk. akár adattípusok.

Például - a teljes kódot a program működését bemutató kétdimenziós dinamikus tömb függvények segítségével.

Az első cikket írtam, hogy „memóriát egyetlen funkciója, és hogy felszabadítsa a másik - egy rossz ötlet, tele hibákkal.” Ezért érdemes ezt a példát is mutatva csak akkor működik, funkciók és tömbök mutatók.

Míg a másik oldalon. Másrészt, egy nagyon hasonló megközelítés gyakran használják az osztályokban, ahol a forrás (ebben az esetben, a lánya) rögzítésre kerül egy funkciót (tervező), és megszabadítjuk a másikba (destructor). De abban az esetben az osztályok, tokozás, biztonságot nyújt a kritikus adatok és fenntartása konzisztens állapotban a példány módszerek az osztály.

Egy sor mutató használt minden program, amely képes fogadni input a parancssorból (vagy felhívja az operációs rendszer). Az egyik klasszikus formája fő () függvény a következő:

Az érvek a függvény a sorok számát argc (méret a mutató tömb) és egy sor mutató húrok - argv. Ie argv - ez egy tömb mutatókat tömbök char értékeket.

Talán ez minden, amit el akartam mondani, ebben a cikkben. Remélem, hogy valaki hasznosnak ítéli a maguk számára.

Hogy veletek legyen szent apostolainak és Bjarne meg! ;-)

Kapcsolódó cikkek