Aliohjelma kysy_matka joutuu palauttamaan kysytyn matkan arvon kutsuvalle ohjelmalle. Tämän takia aliohjelmalle ei viedä matkan arvoa parametrinä, vaan sen paikan osoite, johon aliohjelman tulos täytyy laittaa:
kysy_matka(&matka_mm)
Vastaavasti parametri esitellään osoitin- tyyppiseksi aliohjelman esittelyssä:
void kysy_matka(int *pMatka_mm)
Jatkossa pitää muistaa, että tämän aliohjelman pMatka_mm on osoite sinne, minne tulos pitää laittaa. Nimeämmekin tässä opiskelun alkuvaiheessa osoitinmuuttujat aina alkamaan pienellä p- kirjaimella (p =pointer). Tällaista nimeämistapaa, jossa muuttujan alkukirjaimilla kuvataan muuttujan tyyppi, sanotaan unkarilaiseksi nimeämistavaksi. Jotkut ohjelmoinnin opettajat vastustavat nimeämistapaa, mutta suuria Windows- ohjelmia lukiessa täytyy todeta että on todella mukava tietää mitä tyyppiä mikäkin muuttuja on.
Aliohjelmassa on aluksi yksinkertaisuuden vuoksi esitelty aliohjelman paikallinen muuttuja mm, johon päätteeltä saatava arvo ensin luetaan. Jotta myös pääohjelma saisi tietää tästä, pitää suorittaa epäsuora osoitus (" tähdätä osoitinta pitkin "):
*pMatka_mm = mm;
"Tosiohjelmoija" ei tällaista apumuuttujaa kirjoittaisi, vaan lyhentäisi aliohjelman suoraan muotoon:
void kysy_matka(int *pMatka_mm) { cout << "Anna matka millimetreinä>"; cin >> *pMatka_mm; }
Vinkki
A
"Tähtäämisoperaation" muistaa ehkä helpoimmin, jos ajattelee että muuttujan nimi onkin *pMatka_mm eikä pMatka_mm.
Lyhennetty C- versio samasta aliohjelmasta olisi:
void kysy_matka(int *pMatka_mm) { printf("Anna matka millimetreinä>"); scanf("%d",pMatka_mm); }
Aikaisemmin olemme tottuneet kirjoittamaan scanf- funktioon
scanf("%d",&matka_mm);
Nyt kuitenkin pMatka_mm on valmiiksi osoite, jolloin &- merkki täytyy jättää pois kutsusta. Toisaalta voisimme ajatella, että muuttujan nimi onkin *pMatka_mm (koska se on niin esitelty) ja tällöin scanf:n kutsu olisi
scanf("%d",&*pMatka_mm); /* ==scanf("%d",pMatka_mm); */
On siis erittäin tärkeää ymmärtää milloin on kyse osoitteesta ja milloin arvosta.