8.4.3 * ja &
Osoittimen sisällön ottaminen
*p
on sallittu silloin, kun p on esitelty osoittimeksi johonkin muuhun
tyyppiin kuin void tyyppiin. Siis
c-muut\ososij.c - miten osoitinta saa käyttää
/* ososij.c */
int *p,i; ... i = *p; /* OK jos on ollut sijoitus p = */
double *p,d; ... d = *p; /* OK jos on ollut sijoitus p = */
void *p; int i; ... i = *p; /* VÄÄRIN */
Jos otetaan muuttujan osoite
&i
saadaan osoitin, joka on samaa tyyppiä kuin muuttuja. Siis
int i,*p; p = &i; /* OK */
double *p,d; p = &d; /* OK */
void *p; int i; p = &i; /* OK, koska void osoittimelle saa
sijoittaa minkä tahansa osoittimen */
Seuraavat ovat oikein, mutta niitä täytyy varoa:
double *p; int i;
p = &i; /* VAARALLINEN */
i = *p; /* OK, paikassa p oleva double muuttuu int */
Jos i ja j on esitelty vaikkapa int i,j;, ei
seuraavassa ole mieltä:
int i,j;
j = *i; /* VÄÄRIN, koska i ei ole osoitin! */
- Tästä
tehtävästä huolimatta ei alla olevan kaltaisia sotkuja tule
käyttää!
- Olkoon muuttujien esittelyt kuten ohjelmassa kissaoso.c.
Missä seuraavista tapauksissa tulee sijoitetuksi 5 muuttujalle
kissa (*&i tarkoittaa *(&i)):
-
- /* ososotku.c */
- /* a */ *&kissoja = 5;
- /* b */ &*kissoja = 5;
- /* c */ *&*&*&*&kissoja = 5;
- /* d */ &*pElaimia = &kissoja; *&*pElaimia = 5;
- /* e */ *&pElaimia = kissoja; *pElaimia = 5;