Osoittimet C-ohjelmoinnissa esimerkkien kanssa
Osoitin on muuttuja, joka tallentaa toisen muuttujan osoitteen. Toisin kuin muut muuttujat, joilla on tietyntyyppisiä arvoja, osoitin pitää muuttujan osoitetta. Esimerkiksi kokonaislukumuuttuja pitää sisällään (tai voi sanoa tallentaa) kokonaislukuarvon, mutta kokonaislukumittari sisältää kokonaismuuttujan osoitteen. Tässä oppaassa keskustelemme osoittimista C-ohjelmoinnissa esimerkkien avulla.
Ennen kuin keskustelemme osoittimista C: ssä, otetaan yksinkertainen esimerkki ymmärtääksemme, mitä tarkoitamme muuttujan osoitteella.
Yksinkertainen esimerkki siitä, kuinka ymmärtää muuttujan osoitteen käyttäminen ilman osoittimia?
Tässä ohjelmassa meillä on muuttujan int-tyyppinen numero. Numeron arvo on 10 ja tämä arvo on tallennettava jonnekin muistiin, eikö? Jokaiselle muuttujalle, joka pitää kyseisen muuttujan arvon, varataan muistitila, tällä muistitilalla on osoite. Esimerkiksi asumme talossa ja talollamme on osoite, joka auttaa muita ihmisiä löytämään talomme. Samalla tavalla muuttujan arvo tallennetaan muistiosoitteeseen, mikä auttaa C-ohjelmaa löytämään kyseisen arvon tarvittaessa.
Oletetaan siis, että muuttujalle num annettu osoite on 0x7fff5694dc58
, mikä tarkoittaa, että mikä tahansa arvo, jonka annamme numerolle, tulisi tallentaa sijaintiin: 0x7fff5694dc58
. Katso alla oleva kaavio.
Tulos:
Value of variable num is: 10Address of variable num is: 0x7fff5694dc58
Yksinkertainen esimerkki osoittimista C: ssä
Tämä ohjelma näyttää, kuinka osoitin ilmoitetaan ja käytetään. On monia muita asioita, joita voimme tehdä osoittimilla, olemme keskustelleet niistä myöhemmin tässä oppaassa. Toistaiseksi meidän on vain osattava linkittää osoitin muuttujan osoitteeseen.
Tärkeä huomautettava asia on: Osoittimen tietotyyppi ja muuttujan on oltava sama, int-osoitin voi pitää int-muuttujan osoitetta, samoin kellutietotyypillä ilmoitettu osoitin voi pitää kelluvan muuttujan osoitteen. Alla olevassa esimerkissä osoitin ja muuttuja ovat molemmat int-tyyppisiä.
Tulos:
Address of variable num is: 0x7fff5694dc58
C-osoittimet – operaattorit, joita käytetään osoittimien kanssa
Keskustellaan operaattoreista & ja *, joita käytetään osoittimien kanssa kohdassa C.
”Operaattorin osoite (&) Operaattori
Olemme jo ensimmäisessä esimerkissä nähneet, että voimme näyttää muuttujan osoitteen ampersandilla Olen käyttänyt & num -toimintoa muuttujan num osoitteen käyttämiseen. Operaattori & tunnetaan myös nimellä ”Operaattorin osoite”.
printf("Address of var is: %p", &num);
Huomattavaa:% p on muodon määrittelijä, jota käytetään osoitteen näyttämiseen heksamuodossa.
Nyt kun tiedät miten saada muuttujan osoite, mutta miten se voidaan tallentaa johonkin toiseen muuttujaan? Siellä viitteet tulevat kuvaan. Kuten tämän oppaan alussa mainittiin, C-ohjelmoinnin osoittimia käytetään muiden muuttujien osoitteen pitämiseen.
Osoitin on aivan kuten toinen muuttuja, suurin ero on, että se tallentaa toisen muuttujan osoitteen eikä arvo.
”Arvo osoitteessa” (*) Operaattori
* Operaattori tunnetaan myös nimellä Arvo osoitteessa -operaattori.
Osoittimen ilmoittaminen ?
Yllä olevat ovat muutamia esimerkkejä osoitinlausekkeista. Jos tarvitset osoittimen kokonaislukumuuttujan osoitteen tallentamiseen, osoittimen tietotyypin tulisi olla sama. Sama tapaus on muiden tietotyyppien kanssa.
Käyttämällä * -operaattoria voimme käyttää muuttujan arvoa osoittimen avulla.
Esimerkiksi:
double a = 10;double *p;p = &a;
* p antaisi meille muuttujan a arvon. Seuraava käsky näyttää tuotoksena 10.
printf("%d", *p);
Vastaavasti, jos osoitamme arvon * osoittimelle näin:
*p = 200;
Se muuttaisi arvon v viljelty a. Yllä oleva lauseke muuttaa a: n arvon arvosta 10 arvoon 200.
Esimerkki osoittimesta, joka osoittaa & – ja *
-lähdön käytön :
Value of variable var is: 10Value of variable var is: 10Address of variable var is: 0x7fff5ed98c4cAddress of variable var is: 0x7fff5ed98c4cAddress of pointer p is: 0x7fff5ed98c50
Otetaan muutama esimerkki sen ymmärtämiseksi paremmin –
Sanotaan, että meillä on char-muuttuja ch ja osoitin ptr, joka pitää ch: n osoitteen.
char ch="a";char *ptr;
Lue ch: n arvo
printf("Value of ch: %c", ch);orprintf("Value of ch: %c", *ptr);
Muuta ch: n arvoa
ch = "b";or*ptr = "b";
Yllä oleva koodi korvaisi arvon a arvolla b .
Voitteko arvata seuraavan C-ohjelman tuloksen?
Tulos:
Address of var is: 0x7fff5d027c58Address of var is: 0x7fff5d027c58Value of var is: 10Value of var is: 10Value of var is: 10Value of pointer p is: 0x7fff5d027c58Address of pointer p is: 0x7fff5d027c50
Lisää aiheita osoittimissa
1) Osoitin osoittimeen – Osoitin voi osoittaa toiseen osoittimeen (mikä tarkoittaa, että se voi tallentaa toisen osoittimen osoitteen), sellaiset osoittimet tunnetaan kaksoisosoittimena TAI osoittimena osoittimeen.
2) Osoittimien välittäminen funktiolle – Osoittimet voidaan välittää myös argumenttina funktiolle. Tämän ominaisuuden avulla funktio voidaan kutsua viitteenä ja taulukko voidaan siirtää funktiolle kutsun aikana.
3) Funktion osoittimet – Funktion osoitin on aivan kuin toinen osoitin, sitä käytetään funktion osoitteen tallentamiseen. Toimintoosoitinta voidaan käyttää myös toiminnon kutsumiseen C-ohjelmassa.