Tutkitaanpa vaikkapa seuraavaa ohjelmaa:
// kissaoso.cpp
// Mitä ohjelma tulostaa?
#include <iostream.h>
int main(void)
{
int kissoja,koiria;
int *pElaimia; // Osoitinmuuttuja kokonaislukuun. (p = pointer)
pElaimia = &kissoja;
*pElaimia = 5;
pElaimia = &koiria;
*pElaimia = 3;
cout << "Kissoja on " << kissoja << " ja koiria " << koiria << "." << endl;
return 0;
}
Osoitinmuuttuja määritellään laittamalla * muuttujan nimen eteen esiteltäessä muuttujaa. Sijoituksessa
osoitin = // tässä tapauksessa pElaimia =
pitää oikealla puolella olla osoite- tyyppiä oleva lauseke (esim. &kissoja).
Vastaavasti muoto *osoitin ("tähdätään osoitinta pitkin") tarkoittaa sen muistipaikan sisältöä, johon muuttuja osoitin osoittaa. Olkoon meillä muisti jakaantunut käännöksen jälkeen seuraavasti:
Osoitinmuuttujia tarvitaan erityisesti aliohjelmien ja taulukoiden yhteydessä. Tämä esimerkki on itse asiassa varsin huono! Nimenomaan tällaista moninimisyyttä ( aliasing), eli sama muuttuja voi muuttua useata eri kautta, tulisi välttää, koska se on omiaan tekemään ohjelmista epäluotettavia ja vaikeasti ylläpidettäviä. Järkevämmän osoite- esimerkin otamme heti kun saamme aliohjelmat kunnolla käyttöön.
Varoitus! Edellisestä tehtävästä huolimatta ÄLÄ KOSKAAN mene itse keksimään arvoja, joita sijoitat osoitinmuuttujalle. Tämä on 99.999% varma tapa saada kone kaatumaan. Käytännössä osoittimien arvot (osoitteet) ovat edellä kuvattua esimerkkiä monimutkaisempia.