Mutatókat programozás, devprog blog a programozók
Ezen a reggelen, toltam, hogy a tankönyvekben a programozás nem kap elég figyelmet egy ilyen fontos témát mutatók. Azaz, a figyelem természetesen fizetni, de az elv a tanulás dolgozni mutató vagy nem érti, vagy ami még rosszabb, egyáltalán nem világos. Így a különböző fórumokon, konferenciákon a programozás minden harmadik új programozó arra kéri, hogy segítsen neki foglalkozni a témával. Ez a rövid cikk megpróbálja pótolni ezt a hiányosságot. Minden példa a különböző programozási nyelvek - így minden tiszta volt, nem számít, milyen nyelvet tanulnak. Azt is feltételezzük, hogy Ön ismeri legalább az egyik a három nyelven - Pascal \ Delphi, C ++ és assembly.
Mint tudod, minden típusnak megvan a változó méretű. Például, egy olyan típusú egész szám - processzor allokál 2 bájt memóriát, és olyan típusú bájt - 1 bájt. Under longint - DWORD - azaz "dupla szó", azaz 4 byte. Tehát SZÓ - ez 2 byte, vagy „szó”. Például egy byte - két szám 00 és FF (hexadecimális). Minden egyes típusú adatok - a mérete a memóriában (amelyben az egyik, megtalálható a nyelv alapjai).
Ez, mint tudjuk, ha megnézi az asztalunkhoz, és ha leírjuk a változó - mutatót Integer, akkor lenne szükség, pontosan 2 bájt memória és a tábla, hogy a memória, akkor a következő formában:

Miért érdemes mutatókat?
Mint tudja, a hívás eljárások és függvények a programozási nyelvek a következők:
# іnclude <іostrеam.h>
INT maіn (int argc, char * argv [])
char * lpString; // hogy egy változót, a mutató egy char
char String [] = «Az új vonal"; // kijelentik array (string)
cout < cout < vissza 0; // program vége By the way, annak érdekében, hogy az értéket közvetlenül a sejt - egy mutató hivatkozás feloldási műveletet konzolok formájában „*” szimbólum előtt változó. cout < cout <<*lpString < Hogy kapnánk a kimenet csak egy karakter - „H”. Íme néhány példa más nyelveken: kezdődik programot test1; By the way, észre, hogy hozok egy húr: programot test1; Pointer_String: lpStr; vString: String; ClrScr; Pointer_String: = @vString; writeln (Pointer_String ^); Itt azt egyértelműen meg kell határozni, hogy milyen típusú indexek. Azaz, például lpStr - egy mutatót String, és így tovább. És amikor hivatkozva dereference egy mutató, nem vagyunk szabadon határozza meg, hogy mire vonatkozik az indexet. Nos, a végén, egy példát assembly nyelv használata a fordító elterjedt - MASM32. Nem adom az összes kódot, de csak azt mutatják, a legfontosabb: Húr db «Assembly húr!», 00; Megállapítottuk tömb egy null bájt végén nyomja offset string; hozott egy köteg változtatható lökettérfogatú karakterlánc tolja 0; telefonfülke Count dd 00h; Mint látható, a szerelő kezeli az ilyen szerkezetek nagyon egyszerű. Pointerek - egy nagyszerű eszköz húr manipuláció Mi lesz fejleszteni egy programot, amely helyébe a sorban az összes szimbólumot „*” a hiányosságokat és kinyomtathatja az eredményeket, hogy a konzol. Opciót a C: # іnclude <іostrеam.h> voіd main () lpCharString = szText [0]; A (méret = lstrlen (lpCharString) ;! size = 0; mérete-, lpCharString ++) ha (* lpCharString == '*') * lpCharString = 0x20; cout <<*lpCharString; var Counter: = 1 iSize-2 do Mint látható is, minden kényelmes és intuitív. De egy dolog én mindent - még megmagyarázni. Nézze meg, hol a ciklusban én pont -2 teljes hossza? Tehát, Delphi formátumstring hogy mielőtt a vonal lesz a területen a típus szó és a mező hosszát a húr. Úgy néz ki, mint ez: És mivel nem kell nekünk, egyszerűen vonjuk őket. Bár, ha nem veszi - minden működni fog természetesen. De én csak azt mutatta, hogy milyen formátumban Delphi szálakat. Ami a többit illeti, mindent ebben a programban teljesen megegyezik a programozott C. Pascal dolgok is.
Azaz, ha ahelyett, hogy egy string:
MessageBox (0, lpString, String1,0); // megjelenik egy ablak a szöveget, de a különböző forrásokból származó
végén.
var str: string;
lpStr: pointer;
kezdődik
lpStr: = @ str;
str: = 'Pascal pointer!';
writeln (string (lpStr ^));
readln;
dobja (lpStr);
lpStr: = nil;
végén.
használja crt;
típus
lpStr = ^ string;
lpInt = ^ egész szám;
lpReal = ^ valós;
Pointer_Integer: lpInt;
Pointer_Real: lpReal;
vINTEGER: integer;
Vreal: Real;
vString: = 'Hol a mutató?';
vINTEGER: = 100;
Vreal: = 456.3000;
Pointer_Integer: = @vInteger;
Pointer_Real: = @vReal;
writeln (Pointer_Integer ^);
writeln (Pointer_Real ^);
...
... itt tiszta a jelek ...
...
pop [lpString]; Mi vegye ki azt a köteget, és tegye egy lpString
nyomja meg [lpString]; c mutató vonal
nyomja meg [lpString]
nyomja HWND_DESKTOP
lpString dd 00h;
húr db «Helló Wordl» 00
Nos, valami pointerek rendezni. Most mindent rendbe egy kényelmes asztal, és továbbra is működni fog a mutató.
# іnclude
char * lpCharString;
char szText [] = »1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 0" ;
int a;
int mérete;
>
>
szStr: array [0..20] Char;
lpStr: ^ Char;
iSize: integer;
Counter: integer;
kezdődik
szStr: = '1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 0';
lpStr: = @szStr;
iSize: = hossz (szStr);
kezdődik
ha lpStr ^ = '*' akkor kezdődik
lpStr ^: = '';
végén;
levelet (lpStr ^);
Inc (lpStr);
végén;
readln;
végén.