Pointers and Functions
Când treci o variabilă către o funcție, funcția primește o copie. Pointerii ne lasă să facem ceva special: transmitere prin referință
Mai întâi, hai să vedem problema. Această funcție încearcă să interschimbe două numere dar eșuează
#include <stdio.h>
void interschimba(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main(void) {
int x = 10, y = 20;
interschimba(x, y);
printf("x = %d, y = %d\n", x, y);
return 0;
}
Ieșire
x = 10, y = 20
Nu s-a întâmplat nimic! Funcția a interschimbat copiile locale, dar x și y originali nu s-au schimbat. Copiile au fost distruse când funcția s-a încheiat
Soluția: transmite pointeri în loc de valori
#include <stdio.h>
void interschimba(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main(void) {
int x = 10, y = 20;
interschimba(&x, &y);
printf("x = %d, y = %d\n", x, y);
return 0;
}
Ieșire
x = 20, y = 10
Acum funcționează. Am transmis adresele lui x și y. Funcția a urmat acele adrese și a schimbat valorile reale. Aceasta este transmiterea prin referință, cea mai importantă utilizare a pointerilor
Acest tipar este peste tot în C. Vrei ca o funcție să modifice o variabilă? Transmite-i adresa
#include <stdio.h>
void dubleaza(int *n) {
*n = *n * 2;
}
int main(void) {
int scor = 50;
dubleaza(&scor);
printf("%d\n", scor); // 100
return 0;
}
Altă utilizare comună: funcții care trebuie să returneze mai multe valori. O funcție din C poate returna doar un singur lucru, dar cu pointeri putem "returna" câte vrem
#include <stdio.h>
void min_max(int tablou[], int n, int *min, int *max) {
*min = tablou[0];
*max = tablou[0];
for (int i = 1; i < n; i++) {
if (tablou[i] < *min) *min = tablou[i];
if (tablou[i] > *max) *max = tablou[i];
}
}
int main(void) {
int numere[] = {3, 7, 1, 9, 4};
int lo, hi;
min_max(numere, 5, &lo, &hi);
printf("Min: %d, Max: %d\n", lo, hi);
return 0;
}
Ieșire
Min: 1, Max: 9
Funcția "returnează" atât minimul cât și maximul prin pointeri. Este idiomatic în C. Vei vedea asta peste tot
Misiune: Amplificatorul de semnal
La centrul de calcul, un traductor de semnal citește o valoare brută de pe bandă magnetică. Amplificatorul trebuie s-o tripleze înainte de a o trimite mai departe, dar accesul direct la variabilă nu e permis, doar prin pointer.
- Citește un int semnal din input
- Scrie o funcție tripleaza care primește un pointer la int și triplează valoarea către care pointează
- Apelează tripleaza(&semnal) din main
- Afișează rezultatul
Exemplu
Intrare
5
Ieșire
15
Exemplu
Intrare
10
Ieșire
30