Hirdetés
Akár felismeri, akár nem, a használt programok túlnyomó többsége valamilyen módon használja a mutatókat. Talán megtapasztaltad a NullPointerException egy bizonyos ponton. Programozóként az Ön által írt kód több mint valószínűleg mutatókat fog használni, még akkor is, ha még nem telepítette őket.
Ma megmutatom, hogyan működnek a mutatók, ezért érdemes megnézni hogyan működnek a tömbök és a listák Hogyan működnek a tömbök és a listák a PythonbanA tömbök és a listák a leghasznosabb adatstruktúrák a programozás során - bár kevés ember használja ki ezeket teljes mértékben. Olvass tovább egy programozó alapozó számára. Ez a cikk inkább elmélet alapú lesz, mint általában, de tartsd be azt, a mutatók nagyon összetettek!
Összeállítási kód
Mielőtt belemerülne a mutatókba, meg kell értenie a kód felépítésének és végrehajtásának módját - talán már tudja ezt. Ez a szakasz meglehetősen általános megállapításokat tartalmaz - a többség nyelvek, de nem feltétlenül mindegyik.
Vessük vissza a dolgokat a kezdetbe. Minden számítógép
binárisat használ Mi a bináris? [Technológia magyarázata]Mivel a bináris annyira alapvető fontosságú a számítógépek létezéséhez, furcsanak tűnik, hogy még soha nem foglalkoztunk a témával - tehát ma azt gondoltam, hogy röviden áttekintjük, mi a bináris ... Olvass tovább , egy sorozat és egy nulla, amelyek a modern technológiát alkotják, amint azt ismertük. Rendkívül nehéz bármit kódolni binárisan (a fájlok nagyon zavaróak lennének), mivel ezek a nyers utasítások, amelyekre a központi feldolgozó egység vagy A CPU működik Mi a CPU és mit csinál?A számítási rövidítések zavaróak. Mi egyébként a CPU? És szükségem van egy négy- vagy kétmagos processzorra? Mi lenne az AMD, vagy az Intel? Azért vagyunk itt, hogy megmagyarázza a különbséget! Olvass tovább . Ezt nevezik Gépi kód.A következő lépés a gépi kód használatával gyülekezés. Ez kissé ember számára olvasható formátum. Bár még mindig bonyolult beprogramozni, lehetséges. Az összeállítás a feladatok végrehajtására szolgáló egyszerű parancsok sorozatából áll, és a néven ismert alacsony szint programozási nyelv. Lehetőség van összetett programok írására, de nehéz elvont fogalmakat kifejezni, és sok megfontolást igényel.
Sok videojátékok és nagy teljesítményű alkalmazások logikájának része az összeszerelés, mivel a valódi sebességnövekedés megtalálható, ha tudja, mit csinál. A programozási projektek túlnyomó többségének azonban egyáltalán nem kell tudnia összeszerelését.
Tehát ha a gépi kód írása túlságosan nehéz, és az összeszerelést túlságosan nehéz programozni, akkor mire írja a kódot? Itt van magas szint nyelvek jönnek be. A magas szintű nyelvek megkönnyítik a programok írását. Programozhat valami olyanban, ami hasonlít az anyanyelvére, és könnyű kifejezni komplex algoritmusokat. Lehet, hogy hallott már sok magas szintű nyelvről (és határozottan használta volna a bennük írt programot):
- ALAPVETŐ
- C ++
- Selypít
Ezek a nyelvek nagyon régiak, és sokan az 1950-es évek elején alakultak ki! Szinte minden modern programozási nyelv magas szintű nyelv, beleértve a PHP-t és a Python-ot is. Minden nap több nyelvet feltalálnak (bár valószínűleg már elég van ezekhez), de hogyan működik még mindig a kód megfelelően, ha a számítógépek gépi kódot igényelnek?
Itt jön be az összeállítás. A fordító egy olyan program, amely konvertálja a magas szintű kódot egy végrehajtható formába. Ez lehet egy másik magas szintű nyelv, de általában összeszerelés. Egyes nyelvek (például Python vagy Java) konvertálják a kódot egy közbenső szakaszba, az úgynevezett bájtkódot. Ezt később újra össze kell állítania, ez általában igény szerint történik, például amikor a program fut. Ezt nevezik épp időben összeállítása, és ez nagyon népszerű.
Memóriakezelés
Most, hogy tudja, hogy működnek a programozási nyelvek, nézzük meg a memóriakezelést magas szintű nyelveken. Ezekre a példákra fogok használni ál álkód - nem egy adott nyelvre írt kód, hanem a fogalmak megjelenítésére szolgál, a pontos szintaxis helyett. Ma ez leginkább a C ++-ra fog hasonlítani, mivel ez a véleményem szerint a legjobb magas szintű nyelv.
Ez a szakasz segít, ha megérti a következőket hogyan működik a RAM Gyors és piszkos útmutató a RAM-hoz: Mit kell tudniA RAM minden számítógép kulcsfontosságú eleme, de zavaró lehet. Könnyen érthető fogalom szerint bontjuk le. Olvass tovább .
A legtöbb nyelvnek változói vannak - tárolók, amelyek bizonyos adatokat tárolnak. Egyértelműen meg kell határoznia az adattípust. Néhány dinamikusan gépelt nyelv, például a Python vagy a PHP kezeli ezt az ön számára, ám ezeket még meg kell tenni.
Tegyük fel, hogy van egy változó:
int myNumber;
Ez a kód egy változót hív a számom, és adattípust ad egész szám. A fordítás után a számítógép ezt a parancsot úgy értelmezi:
„Keressen egy üres memóriát, és foglaljon elég nagy helyet egy egész szám tárolására”
Miután ezt a parancsot végrehajtotta, egy másik program nem tudja felhasználni ezt a memóriaegységet. Még nem tartalmaz adatot, de a myNumber változó számára van fenntartva.
Most rendeljen értéket a változóhoz:
myNumber = 10;
A feladat befejezéséhez a számítógép elérheti a fenntartott memóriahelyet, és megváltoztatja az ott tárolt értéket erre az új értékre.
Nos, ez mind jó és jó, de hogyan lehet megőrizni a memóriahelyeket? Ha a programok az összes memóriát fenntartják, amire tetszik, a RAM azonnal megtelik - ez egy a nagyon lassú rendszer.
E potenciális probléma elkerülése érdekében számos nyelv végrehajtja a szemetes, a megváltoztatott változók megsemmisítésére (és ennélfogva a fenntartott memóriahelyek felszabadítására) hatáskörön kívül.
Lehet, hogy azon tűnik, vajon mi a hatókör és miért olyan fontos. A hatókör meghatározza a változók vagy a program által használt memóriák határait és élettartamát. A változó „kívül esik”, ha egy kóddal már nem érhető el (azaz amikor a szemétgyűjtő belép). Íme egy példa:
függvény matematika () {int firstNumber = 1; } int secondNumber = 2; nyomtatás (elsőszám + második szám); // nem fog működni
Ez a példa nem fog összeállni. A változó firstNumber belül van matematika funkciót, tehát erre van hatóköre. Nem érhető el azon funkciótól kívül, amelyben deklarálta. Ez egy fontos programozási koncepció, és megértése elengedhetetlen a mutatókkal való együttműködésben.
A memória kezelésének ilyen módját nevezzük Kazal. Így működik a programok túlnyomó többsége. Nem kell megértenie a mutatókat annak használatához, és meglehetősen jól felépített. A verem hátránya a sebesség. Mivel a számítógépnek memóriát kell hozzárendelnie, nyomon kell követnie a változókat, és futtatnia kell a szemétgyűjtést, van egy kis fej. Ez jó a kisebb programoknál, de mi lenne a nagy teljesítményű feladatokkal vagy az adatok nehéz alkalmazásaival?
Enter: mutatók.
pointerek
A felületen a mutatók egyszerűen hangzanak. Hivatkoznak (vmerre mutat) egy hely a memóriában. Lehet, hogy ez nem különbözik a veremben található „normál” változóktól, de bízz bennem, óriási különbség van. A mutatókat a halom. Ez az ellenkezője a veremnek - kevésbé szervezett, de sokkal gyorsabb.
Nézzük meg, hogy a változók hogyan vannak hozzárendelve a verembe:
int számOne = 1; int numberTwo = numberOne;
Ez egyszerű szintaxis; A változó második az első számot tartalmazza. Értéke átmásolódik a hozzárendelés során a első számú változó.
Ha meg akartad szerezni a memóriacím egy változó értékét, az érték helyett a és a (&) jelet kell használni. Ezt hívják címe operátor, és nélkülözhetetlen része a mutató eszközkészletének.
int számOne = 1; int numberTwo = & numberOne;
Most a második változó pont a memóriahelyre, ahelyett, hogy az első számot átmásolná a saját, új memóriahelyére. Ha kiadná ezt a változót, akkor nem az első számú lenne (annak ellenére, hogy a memóriahelyen van tárolva). Kimenete a memória helye (valószínűleg valami hasonló, mint a 2167, bár a rendszertől és a rendelkezésre álló RAM-tól függően változik). A mutatóban tárolt érték eléréséhez a memória helyének helyett meg kell tennie dereference a mutató. Ez közvetlenül hozzáfér az értékhez, amely ebben az esetben az első számú. A mutató megtagadása a következő:
int numberTwo = * numberOne;
Az deregáció operátor egy csillag (*).
Ez nehéz fogalom lehet megérteni, ezért vizsgáljuk meg újra:
- Az címe operátor (és) tárolja a memória címet.
- Az deregáció operátor (*) elérheti az értéket.
A szintaxis kissé megváltozik, ha a mutatókat deklarálja:
int * myPointer;
A int itt a mutató adattípusára utal pont és nem a mutató típusa.
Most, hogy tudja, hogy mi a mutatók, meg tudsz csinálni néhány igazán ügyes trükköt velük! A memória használatakor az operációs rendszer elindul egymás után. A RAM-ra galamblyukakként gondolhat. Sok lyuk valami tárolására, csak egy használható egyszerre. A különbség az, hogy ezek a galamb lyukak mind számozva vannak. A memória hozzárendelésekor az operációs rendszer a legalacsonyabb számmal indul, és működik. Soha nem ugorhat körbe a véletlen számok között.
Ha a mutatókkal dolgozik, ha egy tömböt rendelt hozzá, a mutató egyszerű növelésével könnyen navigálhat a következő elemhez.
Itt lesz érdekes. Amikor átad egy értéket egy funkciónak (a veremben tárolt változók felhasználásával), akkor ezek az értékek átmásolódnak a függvényébe. Ha ezek nagy változók, akkor a program most kétszer tárolja azokat. Amikor a funkció befejeződött, szüksége lehet módra ezen értékek visszaadására. A funkciók általában csak egy dolgot hozhatnak vissza - szóval mi van, ha két, három vagy négy dolgot akarsz visszaadni?
Ha átad egy mutatót a funkciójának, csak a memória címe kerül másolásra (ami apró). Ez sok munkát takarít meg a processzoron! Lehet, hogy a mutató egy hatalmas képsorra mutat - nemcsak a funkciód működhet pontosan ugyanazon ugyanabban a memóriahelyben tárolt adatok, de ha elkészült, nincs szükség visszaadásra bármi. Tiszta!
De nagyon óvatosnak kell lenned. A mutatók továbbra is kizárhatók, és a hulladékgyűjtő gyűjtheti azokat. A memóriában tárolt értékeket azonban nem gyűjtik össze. Ezt nevezzük memóriaszivárgásnak. Az adatokhoz már nem férhet hozzá (mivel a mutatókat megsemmisítették), de még mindig memóriát használ. Ez a legtöbb program összeomlásának oka, és nagy mennyiségű adat esetén látványosan megbukhat. Az operációs rendszer legtöbbször megsemmisíti a programot, ha nagy a szivárgás (több RAM-ot használ, mint amennyire a rendszer rendelkezik), de ez nem kívánatos.
A hibakeresési mutatók rémálom lehet, különösen akkor, ha nagy mennyiségű adattal dolgozik, vagy hurkokban dolgozik. Hátrányaik és megértésük nehézségei valóban megéri a kompromisszumokat, amelyeket a teljesítmény során kapsz. Bár ne feledje, nem mindig szükséges.
Ez a mai nap. Remélem, megtanultál valami hasznosat egy összetett témában. Természetesen nem fedtünk le mindent, amit tudnunk kell - ez egy nagyon összetett téma. Ha többet szeretne tudni, nagyon ajánlom C ++ 24 órán belül.
Ha ez egy kicsit bonyolult volt, nézzünk meg útmutató a legegyszerűbb programozási nyelvekhez 6 legegyszerűbb programozási nyelv a kezdők számáraA programozás megtanulása a megfelelő nyelv megtalálásáról szól, ugyanúgy, mint a szerkesztési folyamatról. Itt található a hat legegyszerűbb programozási nyelv kezdőknek. Olvass tovább .
Megtudta, hogyan működnek a mutatók ma? Van néhány tipp és trükk, amelyet meg szeretne osztani más programozókkal? Ugrás a megjegyzésekbe, és ossza meg gondolatait az alábbiakban!
Joe számítógépes ismeretek diplomáját szerezte az Egyesült Királyság Lincolni Egyetemen. Professzionális szoftverfejlesztő, és amikor nem repül drónokkal és nem ír zenét, gyakran találkozhat fényképezéssel vagy videó készítésével.