Ghid vizual explicativ și aplicații practice interactive
Memoria RAM poate fi văzută ca un șir lung de casete numerotate.
Fiecare casetă are o adresă unică de memorie (exprimată hexazecimal:
0x7ffd1000) și poate stoca o valoare.
Un pointer este o variabilă care stochează drept valoare adresa de memorie a altei variabile.
&x → Adresa variabilei x (Adresare)*p → Valoarea aflată la adresa stocată în pointerul p (Dereferențiere)
Explicație: Variabila px stochează adresa
0x7ffd1000. Executând cout << *px;,
calculatorul merge la adresa 0x7ffd1000 și citește valoarea 42.
În C++, numele unui vector reprezintă de fapt un pointer constant către primul său element.
Adică v este echivalent cu &v[0].
Aritmetica pointerilor:
Adăugarea unui număr i la un pointer (v + i)
mută adresa cu i * sizeof(tip) bytes în memorie, ajungând la elementul v[i].
v + i este identic cu &v[i] (Adresa elementului i)*(v + i) este identic cu v[i] (Valoarea elementului i)
int v[3] = {10, 20, 30};Analizează secvențele de cod C++ și determină ce se afișează în urma execuției.
Ce va afișa codul C++ de mai jos?
int a = 15; int *p; p = &a; cout << *p;
Explicație: Pointerul p
primește adresa variabilei a (0x2000).
Prin dereferențierea *p, se accesează valoarea stocată
la această adresă, adică 15.
Ce se va afișa în urma execuției?
float val = 8.5; float *pf, **ppf; pf = &val; ppf = &pf; val += 3.5; cout << **ppf;
Explicație:ppf arată către pf,
iar pf arată către val. Instrucțiunea
val += 3.5 modifică valoarea la 12.
Dereferențierea dublă **ppf accesează direct val,
afișând 12.
Știind că tabloul b conține elementele: 7, 3, 9, 14, 5, 2, ce se va afișa?
int b[6] = {7, 3, 9, 14, 5, 2}; cout << *(b + 3);
Explicație: Expresia *(b + 3) este echivalentă cu b[3]. Indexarea începe de la 0 (b[0]=7, b[1]=3, b[2]=9, b[3]=14). Rezultatul afișat este 14.
Ce se va afișa în urma execuției următoarei bucle?
float a[5] = {2.0, 4.5, 6.1, 8.3, 10.0}; float *pa; for(pa = a; pa < a + 3; pa++) { cout << *pa << " "; }
• La prima iterare: pa = a + 0 (adresa &a[0]) ➔ Afișează 2.0
• La a doua iterare: pa++ avansează la &a[1] ➔ Afișează 4.5
• La a treia iterare: pa++ avansează la &a[2] ➔ Afișează 6.1
• Condiția pa < a + 3 oprește bucla înainte de a[3].
Care vor fi valorile afișate pentru variabilele x și y?
int x = 4, y = 10; int *px = &x; int *py = &y; *px += 5; *py -= 4; cout << x << " " << y;
1. *px += 5 modifică valoarea din x: 4 + 5 = 9.
2. *py -= 4 modifică valoarea din y: 10 - 4 = 6.
Afișajul final este 9 6.
Cum va arăta tabloul tab (inițial 10, 20, 30, 40) după execuția codului?
int tab[4] = {10, 20, 30, 40}; for(int i = 0; i < 3; i++) { *(tab + i) = i * 2; }
• i = 0: *(tab + 0) = 0 ➔ tab[0] devine 0
• i = 1: *(tab + 1) = 2 ➔ tab[1] devine 2
• i = 2: *(tab + 2) = 4 ➔ tab[2] devine 4
• Elementul tab[3] nu a fost modificat de buclă și rămâne 40.
Vectorul final este: 0 2 4 40.
Ce se va afișa în urma execuției secvenței următoare?
int a[] = {100, 200, 300, 400, 500}; int *pa = a; cout << *(pa + 4);
Pointerul pa pointează către începutul vectorului a (adică &a[0]).
Expresia *(pa + 4) accesează elementul de la indicele 4, adică al 5-lea element din vector: 500.
Care vor fi valorile finale afișate pentru a și b?
int a = 2, b = 5; int *pa = &a, *pb = &b; *pa += *pb; *pb += *pa; cout << a << " " << b;
1. *pa += *pb ➔ a = a + b ➔ a = 2 + 5 = 7.
2. *pb += *pa ➔ b = b + a (folosind noua valoare a lui a) ➔ b = 5 + 7 = 12.
Afișajul final va fi: 7 12.