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ä