logo

C Osoittimet

C-kielen osoitin on muuttuja, joka tallentaa toisen muuttujan osoitteen. Tämä muuttuja voi olla tyyppiä int, char, array, function tai mikä tahansa muu osoitin. Osoittimen koko riippuu arkkitehtuurista. 32-bittisessä arkkitehtuurissa osoittimen koko on kuitenkin 2 tavua.

Harkitse seuraavaa esimerkkiä määrittääksesi osoittimen, joka tallentaa kokonaisluvun osoitteen.

 int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer. 

Osoittimen ilmoittaminen

Osoitin c-kielessä voidaan ilmoittaa käyttämällä * (tähtisymboli). Se tunnetaan myös nimellä epäsuora osoitin, jota käytetään osoittimen viittauksen poistamiseen.

 int *a;//pointer to int char *c;//pointer to char 

Osoitin esimerkki

Alla on esimerkki osoittimien käyttämisestä osoitteen ja arvon tulostamiseen.

osoittimen esimerkki

Kuten yllä olevasta kuvasta näkyy, osoitinmuuttuja tallentaa numeromuuttujan osoitteen, eli fff4. Lukumuuttujan arvo on 50. Mutta osoitinmuuttujan p osoite on aaa3.

*( epäsuora operaattori ), voimme tulostaa osoitinmuuttujan p arvon.

np. missä

Katsotaanpa osoittimen esimerkkiä, kuten yllä olevassa kuvassa on selitetty.

 #include int main(){ int number=50; int *p; p=&number;//stores the address of number variable printf('Address of p variable is %x 
',p); // p contains the address of the number therefore printing p gives the address of number. printf('Value of p variable is %d 
',*p); // As we know that * is used to dereference a pointer therefore if we print *p, we will get the value stored at the address contained by p. return 0; } 

Lähtö

 Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50 

Osoitin taulukkoon

 int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr. 

Osoitin funktioon

 void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function 

Osoitin rakenteeseen

 struct st { int i; float f; }ref; struct st *p = &ref; 
c osoittimia

Osoittimen etu

1) Osoitin vähentää koodia ja parantaa suorituskykyä , sitä käytetään merkkijonojen, puiden jne. hakemiseen ja sitä käytetään taulukoiden, rakenteiden ja funktioiden kanssa.

2) Voimme palauttaa useita arvoja funktiosta osoittimen avulla.

3) Se tekee sinusta kyvyn käyttää mitä tahansa muistipaikkaa tietokoneen muistissa.

Osoittimen käyttö

Osoittimille on monia sovelluksia c-kielellä.

1) Dynaaminen muistin varaus

C-kielessä voimme varata muistia dynaamisesti käyttämällä malloc()- ja calloc()-funktioita, joissa osoitinta käytetään.

java abstrakti luokka

2) Taulukot, funktiot ja rakenteet

C-kielen osoittimia käytetään laajalti taulukoissa, funktioissa ja rakenteissa. Se vähentää koodia ja parantaa suorituskykyä.

(&) Operaattorin osoite

Operaattorin & osoite palauttaa muuttujan osoitteen. Mutta meidän on käytettävä %u muuttujan osoitteen näyttämiseen.

 #include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; } 

Lähtö

 value of number is 50, address of number is fff4 

NULL-osoitin

Osoitin, jolle ei ole määritetty arvoa mutta NULL, tunnetaan NULL-osoittimena. Jos sinulla ei ole osoitetta määritettävänä osoittimessa ilmoitushetkellä, voit määrittää arvon NULL. Se tarjoaa paremman lähestymistavan.

 int *p=NULL; 

Useimmissa kirjastoissa osoittimen arvo on 0 (nolla).

Osoitinohjelma kahden luvun vaihtamiseksi ilman kolmatta muuttujaa.

 #include int main(){ int a=10,b=20,*p1=&a,*p2=&b; printf('Before swap: *p1=%d *p2=%d',*p1,*p2); *p1=*p1+*p2; *p2=*p1-*p2; *p1=*p1-*p2; printf('
After swap: *p1=%d *p2=%d',*p1,*p2); return 0; } 

Lähtö

pythonin koko
 Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10 

Monimutkaisten viitteiden lukeminen

On useita asioita, jotka on otettava huomioon luettaessa C:n kompleksisia osoittimia. Katsotaan osoittimien suhteen käytettävien operaattoreiden ensisijaisuus ja assosiatiivisuus.

OperaattoriEnsisijaisuusAssosiatiivisuus
(), []1Vasemmalta oikealle
*, tunniste2Oikealta vasemmalle
Tietotyyppi3-

Tässä meidän täytyy huomata, että

  • (): Tämä operaattori on hakasulkuoperaattori, jota käytetään funktion ilmoittamiseen ja määrittämiseen.
  • []: Tämä operaattori on taulukon alaindeksioperaattori
  • * : Tämä operaattori on osoitinoperaattori.
  • Tunniste: Se on osoittimen nimi. Tämä on aina etusijalla.
  • Tietotyyppi: Tietotyyppi on sen muuttujan tyyppi, johon osoittimen on tarkoitus osoittaa. Se sisältää myös muuntimen, kuten signed int, long jne).

Osoittimen lukeminen: int (*p)[10].

Osoittimen lukemiseksi meidän on nähtävä, että () ja [] ovat yhtä tärkeitä. Siksi niiden assosiatiivisuus on otettava huomioon tässä. Assosiatiivisuus on vasemmalta oikealle, joten prioriteetti menee ().

Suluissa () osoittimen operaattorilla * ja osoittimen nimellä (tunniste) p on sama etusija. Siksi niiden assosiatiivisuus on otettava huomioon tässä oikealta vasemmalle, joten prioriteetti menee p:lle ja toinen prioriteetille *.

Määritä 3. prioriteetti arvolle [], koska tietotyypillä on viimeinen etusija. Siksi osoitin näyttää seuraavalta.

  • char -> 4
  • * -> 2
  • p -> 1
  • [10] -> 3

Osoitin luetaan, koska p on osoitin 10-koon kokonaislukujen joukkoon.

'muurarin kaava'

Esimerkki

Kuinka lukea seuraava osoitin?

 int (*p)(int (*)[2], int (*)void)) 

Selitys

Tämä osoitin luetaan, koska p on osoitin sellaiseen funktioon, joka hyväksyy ensimmäisen parametrin osoittimena yksiulotteiseen kokonaislukujen taulukkoon, jonka koko on kaksi ja toisen parametrin osoittimena funktiolle, jonka parametri on mitätön ja palautustyyppi on kokonaisluku.