C – Osoittimesta osoittimeen (kaksoisosoitin)
Edellytys: Osoittimet C:ssä
Osoitinta C:ssä olevaan osoittimeen käytetään, kun halutaan tallentaa toisen osoittimen osoite. Ensimmäistä osoitinta käytetään muuttujan osoitteen tallentamiseen. Ja toista osoitinta käytetään tallentamaan ensimmäisen osoittimen osoite. Siksi ne tunnetaan myös nimellä kaksoisosoittimia . Voimme käyttää osoitinta osoittimeen muuttaaksemme normaalien osoittimien arvoja tai luoda muuttuvan kokoisen 2-D-taulukon. Kaksoisosoitin vie saman verran tilaa muistipinossa kuin tavallinen osoitin.
Osoittimen julistus osoittimeen C:ssä
Osoittimen määrittäminen osoittimeksi on samanlaista kuin osoittimen ilmoittaminen C:ssä. Erona on, että meidän on sijoitettava ylimääräinen '*' ennen osoittimen nimeä.
data_type_of_pointer **name_of_variable = & normal_pointer_variable;
int val = 5; int *ptr = &val; // storing address of val to pointer ptr. int **d_ptr = &ptr; // pointer to a pointer declared // which is pointing to an integer.
Yllä oleva kaavio näyttää osoittimen muistiesityksen osoittimeen. Ensimmäinen osoitin ptr1 tallentaa muuttujan osoitteen ja toinen osoitin ptr2 tallentaa ensimmäisen osoittimen osoitteen.
Esimerkki kaksoisosoittimesta C:ssä
C
// C program to demonstrate pointer to pointer> #include> int> main()> {> > int> var = 789;> > // pointer for var> > int> * ptr2;> > // double pointer for ptr2> > int> ** ptr1;> > // storing address of var in ptr2> > ptr2 = &var;> > // Storing address of ptr2 in ptr1> > ptr1 = &ptr2;> > // Displaying value of var using> > // both single and double pointers> > printf> (> 'Value of var = %d
'> , var);> > printf> (> 'Value of var using single pointer = %d
'> , *ptr2);> > printf> (> 'Value of var using double pointer = %d
'> , **ptr1);> > return> 0;> }> |
Lähtö
Value of var = 789 Value of var using single pointer = 789 Value of var using double pointer = 789
Kuinka kaksoisosoitin toimii?
Kaksoisosoittimen toiminta voidaan selittää yllä olevan kuvan avulla:
- Kaksoisosoitin on ilmoitettu käyttämällä yllä näkyvää syntaksia.
- Tämän jälkeen tallennamme toisen osoittimen osoitteen tämän uuden kaksoisosoittimen arvoksi.
- Nyt, jos haluamme manipuloida tai jättää viittauksen johonkin sen tasosta, meidän on käytettävä Asterisk ( * ) -operaattoria, kuinka monta kertaa haluamme mennä alaspäin.
Osoittimen koko osoittimeen C
C-ohjelmointikielessä kaksoisosoitin käyttäytyy samalla tavalla kuin normaali C:n osoitin. Kaksoisosoitinmuuttujan koko on siis aina yhtä suuri kuin normaalit osoittimet. Voimme varmistaa tämän käyttämällä alla olevaa C-ohjelmaa.
Esimerkki 1: C Ohjelma, joka selvittää osoittimen koon.
C
// C program to find the size of pointer to pointer> #include> int> main()> {> > // defining single and double pointers> > int> a = 5;> > int> * ptr = &a;> > int> ** d_ptr = &ptr;> > // size of single pointer> > printf> (> ' Size of normal Pointer: %d
'> ,> sizeof> (ptr));> > // size of double pointer> > printf> (> ' Size of Double Pointer: %d
'> ,> sizeof> (d_ptr));> > return> 0;> }> |
Lähtö
Size of normal Pointer: 8 Size of Double Pointer: 8
Huomautus: Yllä olevan koodin tulos riippuu myös käytetyn koneen tyypistä. Osoittimen koko ei ole kiinteä C-ohjelmointikielessä ja se riippuu muista tekijöistä, kuten suorittimen arkkitehtuurista ja käytetystä käyttöjärjestelmästä. Yleensä 64-bittisessä käyttöjärjestelmässä koko on 8 tavua ja 32-bittisessä käyttöjärjestelmässä 4 tavua.
Kaksoisosoittimien käyttö C:ssä
Seuraavassa on osoittimen osoittimiin tärkeimmät käyttötavat C:ssä:
- Niitä käytetään moniulotteisten taulukoiden dynaamiseen muistin varaamiseen.
- Niitä voidaan käyttää monitasoisten tietojen, kuten tekstidokumentin kappaleiden, lauseiden ja sanan semantiikan tallentamiseen.
- Niitä käytetään tietorakenteissa suoraan manipuloimaan solmujen osoitetta kopioimatta.
- Niitä voidaan käyttää funktion argumentteina paikalliseen osoittimeen tallennettua osoitetta käsittelemään.
Monitasoiset osoittimet C:ssä
Kaksoisosoittimet eivät ole ainoita C-kielen tukemia monitasoisia osoittimia. Entä jos haluamme muuttaa kaksoisosoittimen arvoa?
Tässä tapauksessa voimme käyttää kolmoisosoitinta, joka on osoitin osoittimeen, eli int ***t_ptr.
Kolmoisosoittimen syntaksi
pointer_type *** pointer_name;
Samoin kolmoisosoittimen arvon muuttamiseksi voimme käyttää osoitinta osoittimeen osoittimeen (Four level Pointer). Toisin sanoen voidaan sanoa, että tason – x muuttujan arvon muuttamiseksi voimme käyttää tasoa – x+1 osoitinta. Ja tätä käsitettä voidaan laajentaa edelleen.
Huomautus : Voimme käyttää mitä tahansa tasoosoitinta C:ssä. Siinä ei ole rajoituksia, mutta se tekee ohjelmasta erittäin monimutkaisen ja altis virheille.
Täytyy lukea - Toimintoosoitin C:ssä