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.
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;
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.
Operaattori | Ensisijaisuus | Assosiatiivisuus |
---|---|---|
(), [] | 1 | Vasemmalta oikealle |
*, tunniste | 2 | Oikealta vasemmalle |
Tietotyyppi | 3 | - |
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.