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! ;-)