Pointeri în C
În C, pointerii sunt un subiect care sperie mulți începători, dar ideea de bază este simplă:
un pointer este o variabilă care ține o adresă de memorie. Adică nu ține direct o valoare
(cum ține un int), ci ține locul unde se află acea valoare în memorie.
1) Ce este o adresă de memorie?
Gândește-te la memorie ca la un bloc cu multe apartamente. Fiecare apartament are un număr (adresa). Valoarea unei variabile stă într-un “apartament”, iar adresa este “numărul apartamentului”.
2) Variabilă normală vs pointer
O variabilă normală (de exemplu un int) conține valoarea:
int x = 10;
Un pointer (de exemplu int*) conține adresa unde se află un int:
int *p = &x;
Aici apar două simboluri importante:
&(address-of) – “dă-mi adresa variabilei”*(dereference) – “du-te la adresa din pointer și ia valoarea de acolo”
3) Exemplu complet, pas cu pas
#include <stdio.h>
int main(void) {
int x = 10; // x ține valoarea 10
int *p = &x; // p ține adresa lui x
printf("x = %d\n", x);
printf("&x = %p\n", (void*)&x);
printf("p = %p\n", (void*)p);
printf("*p = %d\n", *p);
return 0;
}
Ce se întâmplă aici:
xeste 10.&xeste adresa luix.peste aceeași adresă (pentru căp = &x).*peste valoarea de la acea adresă, adică tot 10.
4) De ce sunt pointerii utili?
Pointerii sunt folosiți foarte des în C pentru:
- Modificarea unei variabile dintr-o funcție (transmiți adresa, nu copia).
- Lucrul cu tablouri (array-uri) și parcurgerea lor eficientă.
-
Alocare dinamică de memorie (de exemplu
malloc/free). - Structuri complexe (liste înlănțuite, arbori etc.).
5) Pointeri în funcții: “vreau să modific variabila originală”
În C, când trimiți o variabilă normală într-o funcție, se trimite o copie. Dacă vrei să modifici variabila originală, trimiți adresa ei (un pointer).
#include <stdio.h>
void set_to_99(int *p) {
*p = 99; // modifică valoarea de la adresa p
}
int main(void) {
int x = 10;
set_to_99(&x); // trimitem adresa lui x
printf("x = %d\n", x); // va afișa 99
return 0;
}
Observă combinația:
set_to_99(&x) trimite adresa, iar în funcție *p = 99 modifică valoarea de acolo.
6) Pointeri și tablouri (array)
În C, un tablou și un pointer sunt strâns legate. De multe ori, numele unui tablou “se comportă” ca un pointer către primul element.
#include <stdio.h>
int main(void) {
int a[3] = {10, 20, 30};
int *p = a; // echivalent cu &a[0]
printf("a[0] = %d\n", a[0]);
printf("*p = %d\n", *p);
printf("a[1] = %d\n", a[1]);
printf("*(p+1) = %d\n", *(p+1));
return 0;
}
Explicație:
ppointează laa[0].p+1pointează la următorulintdin memorie, adicăa[1].*(p+1)înseamnă “valoarea de la adresa următorului element”.
7) Greșeli frecvente (și cum le eviți)
7.1) Pointer neinițializat
Dacă declari un pointer și nu îi dai o adresă validă, conținutul lui este “gunoi” (o valoare aleatoare).
Dereferențierea (*p) poate duce la crash.
int *p; // NU e inițializat
//*p = 10; // periculos
Variante corecte: <p>
Dacă vrei, îți pot adapta articolul pentru Blogger/WordPress (cu stiluri CSS simple) sau îți pot adăuga o secțiune separată
despre <strong>pointeri la structuri</strong> și operatorul <code>-></code>.
</p>
int *p = NULL; // sigur, arată clar “nu pointează nicăieri”
7.2) Dereferențierea lui NULL
NULL înseamnă “nici o adresă validă”. Nu ai voie să faci *p dacă p == NULL.
7.3) Folosirea unui pointer după ce “nu mai e valid”
Un exemplu clasic: întorci dintr-o funcție adresa unei variabile locale. Variabila locală dispare când funcția se termină, iar pointerul rămâne “agățat” (dangling pointer).
int* wrong(void) {
int x = 5;
return &x; // GREȘIT: x e local și dispare după return
}
8) Mini-rezumat (de ținut minte)
- Pointer = adresă
&x= adresa luix*p= valoarea de la adresa stocată înp- Folosești pointeri când vrei eficiență, acces la memorie și modificări “în loc” (in-place).
- Nu dereferenția pointeri nevalizi: neinițializați,
NULLsau “dangling”.
9) Exercițiu simplu
Scrie un program care:
- Declară un
int x = 7. - Declară un pointer
int *pși îl setează cu adresa luix. - Folosește
*pca să schimbe valoarea luixîn 42. - Afișează
xși*pși verifică că sunt egale.
Documentatie
Cărți despre limbajul C (RO/EN) + PDF-uri gratuite
Lista de mai jos include titluri comerciale (link către editură/librărie) și resurse gratuite în format PDF din surse care le publică legal (autori, organizații, universități, proiecte open).
1) Cărți în limba română
-
„Limbajul de programare C” (traducere) – Brian W. Kernighan, Dennis M. Ritchie (Editura Teora)
Clasic (K&R) – explicații concise, foarte bun ca referință.
-
„Limbajul C – tehnici de programare eficientă” – (Editura Matrix Rom)
Curs/ghid în română; util pentru consolidare.
-
„Programare în C” – Valeriu Iorga
Introducere în C, orientată spre formarea deprinderilor de programare.
-
„C – Manual complet” – Herbert Schildt (Teora)
Manual voluminos; bun ca referință, mai puțin ca primă carte.
-
„Programarea în limbajul C/C++ pentru liceu” – Vol. II (Polirom)
Țintit pe liceu; multe metode/tehnici și exerciții.
2) Cărți în limba engleză
-
The C Programming Language (2nd ed.) – Kernighan & Ritchie
Clasicul „K&R”; foarte dens, nu întotdeauna ideal ca prim contact.
-
C Programming: A Modern Approach (2nd ed.) – K. N. King
Una dintre cele mai bune cărți pentru învățare sistematică + multe exerciții.
-
Modern C (Third Edition, C23) – Jens Gustedt (Manning)
Modern, orientat pe standarde noi și practici corecte.
-
Effective C (2nd Edition, C23) – Robert C. Seacord (No Starch Press)
Accent pe scriere de C profesionist (corectitudine, siguranță, stil).
-
Head First C – David & Dawn Griffiths
Abordare foarte „vizuală”; bună pentru începători.
-
C Primer Plus (6th ed.) – Stephen Prata
Tutorial complet, potrivit ca „manual de studiu”.
-
Expert C Programming: Deep C Secrets – Peter van der Linden
Mai avansat; bun după ce ai bazele.
3) PDF-uri gratuite (surse legale / open / autor-universitate)
-
Beej’s Guide to C Programming (PDF) – Brian “Beej” Hall
Foarte prietenos, explică clar conceptele de bază.
-
C Notes for Professionals (PDF) – GoalKicker.com
Note compacte + exemple; bun ca „cheat sheet” extins.
-
Modern C (PDF gratuit) – Jens Gustedt (versiune publicată de autor)
Cartea „Modern C” disponibilă ca PDF (distribuit de autor).
-
The C Book (PDF) – Banahan, Brady, Doran
Text complet, „old school”, dar solid ca fundament.
-
C Programming (Wikibooks) – PDF (Wikimedia Commons)
Open-content; util pentru recapitulare și exemple.
-
An Introduction to the C Programming Language and Software Design (PDF) – Tim Bailey
Stil de curs universitar; include și principii de design.
-
The GNU C Reference Manual (PDF) – GNU
Mai mult referință decât tutorial, dar foarte utilă.
-
„Programare în limbajul C cu aplicații în inginerie mecanică” (PDF) – Biblioteca UTCN
Conținut în română, orientat spre aplicații inginerești.
-
„Aplicații C/C++/C# și Arduino în Inginerie Electrică” (PDF) – Biblioteca UTCN
Conținut tehnic, cu exemple aplicate.
-
„Prezentarea limbajului C” (PDF) – IMST.ro (suport de curs)
Suport de curs; bun pentru început rapid.
Susține acest blog
Cumpărând de pe https://mag.automatic-house.ro/ro/ susții blogul meu, iar 10% din vânzări vor fi direcționate către Fundația Dăruiește Viață. Îți mulțumesc!
Mulțumesc pentru atenție!
Pentru întrebări și/sau consultanță tehnică vă stau la dispoziție pe blog mai jos în secțiunea de comentarii sau pe email simedruflorin@automatic-house.ro.
O zi plăcută tuturor !
Back to top of page

