TIE 120 Ohjelmointi (kesä 2001)
Luento 6 - 23.5.2001

Ks. Ohjelmointi++-monisteen luku 8 kohdasta 8.4 alkaen. Stroustrupin luku 5 sekä Hietasen luvut 9.4, 9.5 ja jonkin verran myös luku 10.

   int elaman_tarkoitus = 42;

 - Osoitin on muuttuja
       int * luku;
    on osoitin int-tyyppiseen muuttujaan

 - pitää AINA muistaa alustaa:
        int *luku = &elaman_tarkoitus

 - osoittimen käyttö:
        *luku = 42;
        cout << *luku;

kissaoso.c

 - osoittimeen ei saa sijoittaa suoraan lukua
 - osoittimeen saa sijoittaa:
       - toisen osoittimen  (&muuttuja tms)
       - nolla (0)

 - nollaosoitin (null pointer) tarkoittaa osoitinta, joka
   ei osoita mihinkään
      const int NULL = 0;

tyyppi * muuttuja;  // tyyppi-tyyppiseen muuttujaan
                    // osoittava osoitinmuuttuja
void * muuttuja;  // osoitin määrittelemättömään tyyppin
  - void-osoitinta (void *) pitkin ei saa tähdätä

Voiko sijoitusta i = *p tehdä?
   int i;
   int *p;
      - p on tyyppiä (int*) *p on tyyppiä int
      - sijoitus intistä inttiin on ok
     VOI
   int i;
   void *p;
      - p on tyyppiä (void*) *p on tyyppiä void
      - sijoitus voidista inttiin ei onnistu
     EI VOI

Entä p = &i
   int i;
   int *i;
      - i on tyyppiä int; &i on tyyppiä (int*)
      - sijoitus (int*):stä (int*):een on ok
      VOI
   int i;
   int i;
   void *p;
      - i on tyyppiä int; &i on tyyppiä (int*)
      - sijoitus  (int*):stä (void*):een ONNISTUU

Entäpä osoitin osoittimeen?
   int ** ppET; // osoitin osoittimeen, joka osoittaa int-muuttujaan

     *ppET on sama muuttuja kuin pET
     *pET on sama muuttuja kuin i
        joten
     i on sama muuttuja kuin **ppET
     

Osoittimen käyttöä:
  - funktio, joka haluaa palauttaa arvon muttei nimessään

    void kysy_luku(int * p) {
      cin >> *p;
    }

      int i;
      kysy_luku(&i);

Viimeksi muutettu: ke 4 heinäkuu 2001 15:09:36
Antti-Juhani Kaijanaho <gaia@iki.fi>
Perustuu osittain Vesa Lappalaisen ja Kari Kärkkäisen tekemiin kurssisivustoihin ja teksteihin.