Pointerii în programare, devprog blog pentru programatori
În această dimineață, am împins că în manuale de programare nu se acordă suficientă atenție un astfel de subiect important ca indicii. Aceasta este, atenția este, desigur, plătite, dar principiul învățării pentru a lucra cu indicii sau nu înțelese sau, chiar mai rău, deloc clar. Astfel, în diverse forumuri și conferințe privind programarea la fiecare trei noi programator cere să-l ajute să se ocupe de acest subiect. Acest scurt articol va încerca să umple acest gol. Toate exemplele sunt în diferite limbaje de programare - astfel încât totul a fost clar, indiferent de ce limbă sunteți de învățare. De asemenea, presupun că sunteți familiarizați cu cel puțin una dintre cele trei limbi - este Pascal \ Delphi, C ++ si Assembler.
După cum știți, fiecare tip are dimensiunea variabilă. De exemplu, un tip de număr întreg - procesor alocă 2 octeți de memorie și un tip de octet - 1 octet. Sub longint - DWORD - adică, "cuvânt dublu", care este de 4 octeți. Deci, WORD - acesta este de 2 octeți, sau "cuvânt". De exemplu, un octet - două numere de la 00 la FF (în hexazecimal). Pentru fiecare tip de date - dimensiunea sa în memorie (care unul, poate fi găsit în Reference Language).
Asta este, după cum știți, dacă te uiți la masa noastră, iar dacă vom descrie variabila - pointer la tip Integer, atunci ar avea exact 2 octeți în memorie și masa noastră, adică de memorie, ar lua forma următoare:
De ce indicii de utilizare?
După cum știți, procedurile de apel și funcțiile în limbaje de programare, după cum urmează:
# іnclude <іostrеam.h>
INT maіn (int argc, char * argv [])
char * lpString; // declara o variabilă, un pointer la un char
char String [] = «nostru linie nouă"; // declara o matrice (string)
cout < cout < return 0; // Sfârșitul programului Apropo, pentru a lua valoarea direct din celula - folosind o operație de pointer dereferire de console în formă de simbolul „*“ înainte de variabila. cout < cout <<*lpString < Asta ar obține de ieșire doar un caracter - „H“. Iată câteva exemple în alte limbi: începe test1 de program; Apropo, observați cum am aduce un șir de caractere: test1 de program; Pointer_String: LPSTR; vString: String; ClrScr; Pointer_String: = @vString; writeln (Pointer_String ^); Aici, vom descrie în mod explicit tipurile de indici. Aceasta este, de exemplu, LPSTR - un pointer la un șir, și așa mai departe. Iar când se referă la un pointer dereference, noi nu avem libertatea de a specifica ce se referă la indexul nostru. Ei bine, în cele din urmă, uita-te la un exemplu în limbaj de asamblare, folosind compilatorul pe scară largă - MASM32. Nu voi da toate din cod, ci arată doar cele mai importante: String dB, 00 «șir de asamblare!»; Am declarat matrice cu un octet nul la sfârșitul anului împinge String de compensare; a pus într-o variabilă stivă șir de deplasare împinge 0; cabină telefonică Count dd 00h; După cum puteți vedea, de asamblare se ocupă de astfel de construcții este foarte ușor. Pointerii - o manipulare șir mare instrument Vom dezvolta un program care va fi înlocuit în linia tuturor simbolurilor „*“ la golurile și imprima rezultatele la consolă. Opțiunea pe C: # іnclude <іostrеam.h> voіd main () lpCharString = szText [0]; pentru (size = lstrlen (lpCharString) ;! size = 0; size-, lpCharString ++) if (* lpCharString == '*') * lpCharString = 0x20; cout <<*lpCharString; var pentru Counter: = 1 până la iSize-2 do După cum se poate vedea, de asemenea, tot ceea ce este convenabil și intuitiv. Dar un lucru am totul - încă explica. A se vedea, în cazul în care în ciclul I punctul -2 lungimea totală? Deci, siruri de caractere format Delphi este că, chiar înainte de linia va fi un câmp de tip Word și câmpul conține lungimea șirului. Se pare ca acest lucru: Și, din moment ce ei nu au nevoie de noi, pur și simplu, le scade. Deși, dacă nu luați - totul va lucra desigur. Dar tocmai v-am arătat ce format siruri de caractere Delphi. În ceea ce privește restul, totul în acest program este complet identic cu cel programat în C. lucrurile Pascal, de asemenea.
Adică, dacă în loc de un șir de caractere:
MessageBox (0, lpString, String1,0); // afișează o fereastră cu text, dar din diferite surse
end.
var str: string;
LPSTR: pointer;
începe
LPSTR: = @ str;
str: = 'pointer Pascal!';
writeln (string (LPSTR ^));
readln;
eliminați (LPSTR);
LPSTR: = zero;
end.
utilizează crt;
tip
LPSTR = ^ string;
lpInt = ^ întreg;
lpReal = ^ reală;
Pointer_Integer: lpInt;
Pointer_Real: lpReal;
vINTEGER: Integer;
Vreală: Real;
vString: = 'Unde este indicatorul meu?';
vINTEGER: = 100;
Vreală: = 456.3000;
Pointer_Integer: = @vInteger;
Pointer_Real: = @vReal;
writeln (Pointer_Integer ^);
writeln (Pointer_Real ^);
...
... aici ne curata semnele noastre ...
...
pop [lpString]; Ne scoate-l din stivă și pus într-o lpString
împinge [lpString]; indicii c on-line
împinge [lpString]
împinge HWND_DESKTOP
lpString dd 00h;
db string «Bună ziua Wordl», 00
Ei bine, un fel de indicii sortate. Acum rezolvăm totul un tabel convenabil, și va continua să lucreze cu indicii.
# іnclude
char * lpCharString;
char szText [] = »* 2 * 1 3 * 4 * 5 * 6 * 7 * 8 * 9 * 0" ;
int a;
int size;
>
>
szStr: array [0..20] Char;
LPSTR: ^ Char;
iSize: Integer;
Contor: Integer;
începe
szStr: = '* 2 * 1 3 * 4 * 5 * 6 * 7 * 8 * 9 * 0';
LPSTR: = @szStr;
iSize: = Lungime (szStr);
începe
dacă LPSTR ^ = '*', apoi începe
LPSTR ^: = '';
se încheie;
scrie (LPSTR ^);
inc (LPSTR);
se încheie;
readln;
end.