C/Pass by pointer

< C

C-kielessä funktiot voivat saada parametreinaan vain arvoja (pass by value), eivät muuttujia (pass by reference).

 #include <stdio.h>
 
 void f(int val) { val = 4; }
 
 int main(void) {
   int a = 123;
   f(a);
   printf("%d\n", a);
 }

Yllä olevassa ohjelmassa funktiolle f välitetään lukuarvo 123 sen paikalliseen muuttujaan val. Sitten funktio muuttaa paikallisen muuttujansa arvoksi 4 ja funktio päättyy. Funktion päättyessä kaikki sen paikalliset muuttujat lakkaavat olemasta. Ohjelma siis tulostaa arvon 123, eikä nelosta.

 #include <stdio.h>
 
 void f(int* val) { *val = 4; }
 
 int main(void) {
   int a = 123;
   f(&a);
   printf("%d\n", a);
 }

Tässä ohjelmaa on muokattu siten, että f ottaakin parametrinaan osoittimen muuttujaan ja käyttää sisällään pointterin kohdetta (*val). Funktiota kutsuttaessa funktiolle tulee välittää muuttujan osoite (&a). Välitetty osoite kyllä kopioituu pointteriin, mutta osoitteessa oleva muuttuja sijaitsee silti samassa paikassa, joten funktio pääsee siihen käsiksi ja ohjelma tulostaa odotetusti luvun neljä.

Tässä esitettyä menetelmää, jossa arvon sijaan välitetäänkin muuttujan osoite, kutsutaan pass-by-pointeriksi. Menetelmä on saanut nimensä siitä, että sillä voidaan toteuttaa pass-by-reference-toiminnallsuus, jota C-kielessä ei sellaisenaan ole, pointterin avulla. Useimmat muut ohjelmointikielet tukevat pass-by-referenceä suoraan ja siksi pass-by-pointer on lähinnä C-kielen erikoisuus, kun taasen arvona tai referenssinä välittäminen ovat ohjelmointikielestä riippumattomia käsitteitä.