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:

Pointerii în programare, devprog blog pentru programatori

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.
Adică, dacă în loc de un șir de caractere:

cout <

cout <<*lpString <

Asta ar obține de ieșire doar un caracter - „H“.

Iată câteva exemple în alte limbi:

începe
MessageBox (0, lpString, String1,0); // afișează o fereastră cu text, dar din diferite surse
end.

test1 de program;
var str: string;
LPSTR: pointer;
începe
LPSTR: = @ str;
str: = 'pointer Pascal!';
writeln (string (LPSTR ^));
readln;
eliminați (LPSTR);
LPSTR: = zero;
end.

Apropo, observați cum am aduce un șir de caractere:

test1 de program;
utilizează crt;
tip
LPSTR = ^ string;
lpInt = ^ întreg;
lpReal = ^ reală;

Pointer_String: LPSTR;
Pointer_Integer: lpInt;
Pointer_Real: lpReal;

vString: String;
vINTEGER: Integer;
Vreală: Real;

ClrScr;
vString: = 'Unde este indicatorul meu?';
vINTEGER: = 100;
Vreală: = 456.3000;

Pointer_String: = @vString;
Pointer_Integer: = @vInteger;
Pointer_Real: = @vReal;

writeln (Pointer_String ^);
writeln (Pointer_Integer ^);
writeln (Pointer_Real ^);
...
... aici ne curata semnele noastre ...
...

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
pop [lpString]; Ne scoate-l din stivă și pus într-o lpString

împinge 0; cabină telefonică
împinge [lpString]; indicii c on-line
împinge [lpString]
împinge HWND_DESKTOP

Count dd 00h;
lpString dd 00h;
db string «Bună ziua Wordl», 00

După cum puteți vedea, de asamblare se ocupă de astfel de construcții este foarte ușor.
Ei bine, un fel de indicii sortate. Acum rezolvăm totul un tabel convenabil, și va continua să lucreze cu indicii.

Pointerii în programare, devprog blog pentru programatori

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>
# іnclude

voіd main ()
char * lpCharString;
char szText [] = »* 2 * 1 3 * 4 * 5 * 6 * 7 * 8 * 9 * 0" ;
int a;

lpCharString = szText [0];
int size;

pentru (size = lstrlen (lpCharString) ;! size = 0; size-, lpCharString ++)

if (* lpCharString == '*') * lpCharString = 0x20; cout <<*lpCharString;
>
>

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

pentru Counter: = 1 până la iSize-2 do
începe
dacă LPSTR ^ = '*', apoi începe
LPSTR ^: = '';
se încheie;
scrie (LPSTR ^);
inc (LPSTR);
se încheie;
readln;
end.

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:

Pointerii în programare, devprog blog pentru programatori

Ș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.