Som vi vet det, brukes en peker til å lagre adressen til en variabel i C. Peker reduserer tilgangstiden til en variabel. I C kan vi imidlertid også definere en peker for å lagre adressen til en annen peker. En slik peker er kjent som en dobbel peker (peker til peker). Den første pekeren brukes til å lagre adressen til en variabel, mens den andre pekeren brukes til å lagre adressen til den første pekeren. La oss forstå det med diagrammet nedenfor.
Syntaksen for å erklære en dobbel peker er gitt nedenfor.
array sortere java
int **p; // pointer to a pointer which is pointing to an integer.
Tenk på følgende eksempel.
#include void main () { int a = 10; int *p; int **pp; p = &a; // pointer p is pointing to the address of a pp = &p; // pointer pp is a double pointer pointing to the address of pointer p printf('address of a: %x ',p); // Address of a will be printed printf('address of p: %x ',pp); // Address of p will be printed printf('value stored at p: %d ',*p); // value stoted at the address contained by p i.e. 10 will be printed printf('value stored at pp: %d ',**pp); // value stored at the address contained by the pointer stoyred at pp }
Produksjon
address of a: d26a8734 address of p: d26a8738 value stored at p: 10 value stored at pp: 10
C dobbeltpeker eksempel
La oss se et eksempel der en peker peker til adressen til en annen peker.
Som du kan se i figuren ovenfor, inneholder p2 adressen til p (fff2), og p inneholder adressen til tallvariabelen (fff4).
#include int main(){ int number=50; int *p;//pointer to int int **p2;//pointer to pointer p=&number;//stores the address of number variable p2=&p; printf('Address of number variable is %x ',&number); printf('Address of p variable is %x ',p); printf('Value of *p variable is %d ',*p); printf('Address of p2 variable is %x ',p2); printf('Value of **p2 variable is %d ',*p); return 0; }
Produksjon
Address of number variable is fff4 Address of p variable is fff4 Value of *p variable is 50 Address of p2 variable is fff2 Value of **p variable is 50
Sp. Hva blir resultatet av følgende program?
#include void main () { int a[10] = {100, 206, 300, 409, 509, 601}; //Line 1 int *p[] = {a, a+1, a+2, a+3, a+4, a+5}; //Line 2 int **pp = p; //Line 3 pp++; // Line 4 printf('%d %d %d ',pp-p,*pp - a,**pp); // Line 5 *pp++; // Line 6 printf('%d %d %d ',pp-p,*pp - a,**pp); // Line 7 ++*pp; // Line 8 printf('%d %d %d ',pp-p,*pp - a,**pp); // Line 9 ++**pp; // Line 10 printf('%d %d %d ',pp-p,*pp - a,**pp); // Line 11 }
Forklaring
I spørsmålet ovenfor brukes peker-aritmetikken med dobbeltpekeren. En matrise med 6 elementer er definert som er pekt av en matrise med peker p. Pekermatrisen p er pekt av en dobbelpeker pp. Bildet ovenfor gir deg imidlertid en kort ide om hvordan minnet blir allokert til matrisen a og pekermatrisen p. Elementene til p er pekerne som peker til hvert element i matrisen a. Siden vi vet at matrisenavnet inneholder baseadressen til matrisen, vil det derfor fungere som en peker og kan verdien krysses ved å bruke *(a), *(a+1), osv. Som vist på bildet , a[0] kan nås på følgende måter.
- a[0]: det er den enkleste måten å få tilgang til det første elementet i matrisen
- *(a): siden en lagrer adressen til det første elementet i matrisen, kan vi få tilgang til verdien ved å bruke indirektionspekeren på den.
- *p[0]: hvis a[0] skal åpnes ved å bruke en peker p til den, kan vi bruke indirektionsoperator (*) på det første elementet i pekermatrisen p, dvs. *p[0].
- **(pp): ettersom pp lagrer grunnadressen til pekermatrisen, vil *pp gi verdien til det første elementet i pekermatrisen som er adressen til det første elementet i heltallsmatrisen. **p vil gi den faktiske verdien av det første elementet i heltallsmatrisen.
Når du kommer til programmet, erklærer linje 1 og 2 heltallet og pekermatrisen relativt. Linje 3 initialiserer dobbelpekeren til pekermatrisen p. Som vist på bildet, hvis adressen til matrisen starter fra 200 og størrelsen på heltallet er 2, vil pekermatrisen inneholde verdiene som 200, 202, 204, 206, 208, 210. La oss vurdere at baseadressen til pekermatrisen er 300; dobbelpekeren pp inneholder adressen til pekermatrisen, dvs. 300. Linje nummer 4 øker verdien av pp med 1, dvs. pp vil nå peke til adresse 302.
Linje nummer 5 inneholder et uttrykk som skriver ut tre verdier, dvs. pp - p, *pp - a, **pp. La oss beregne dem hver og en av dem.
cm til fot og tommer
- pp = 302, p = 300 => pp-p = (302-300)/2 => pp-p = 1, dvs. 1 vil bli skrevet ut.
- pp = 302, *pp = 202, a = 200 => *pp - a = 202 - 200 = 2/2 = 1, dvs. 1 vil bli skrevet ut.
- pp = 302, *pp = 202, *(*pp) = 206, dvs. 206 vil bli skrevet ut.
Derfor som et resultat av linje 5, vil utdata 1, 1, 206 bli skrevet ut på konsollen. På linje 6 står *pp++. Her må vi legge merke til at to unære operatorer * og ++ vil ha samme prioritet. Derfor, etter assosiativitetsregelen, vil den bli evaluert fra høyre til venstre. Derfor kan uttrykket *pp++ skrives om til (*(pp++)). Siden pp = 302 som nå blir 304. *pp vil gi 204.
På linje 7 er det igjen skrevet uttrykket som skriver ut tre verdier, dvs. pp-p, *pp-a, *pp. La oss beregne hver enkelt av dem.
- pp = 304, p = 300 => pp - p = (304 - 300)/2 => pp-p = 2, dvs. 2 vil bli skrevet ut.
- pp = 304, *pp = 204, a = 200 => *pp-a = (204 - 200)/2 = 2, dvs. 2 vil bli skrevet ut.
- pp = 304, *pp = 204, *(*pp) = 300, dvs. 300 vil bli skrevet ut.
Derfor, som et resultat av linje 7, vil utgangen 2, 2, 300 bli skrevet ut på konsollen. På linje 8 skrives ++*pp. I henhold til assosiativitetsregelen kan dette skrives om som, (++(*(pp))). Siden, pp = 304, *pp = 204, verdien av *pp = *(p[2]) = 206 som nå vil peke til a[3].
legge til array java
På linje 9 er det igjen skrevet uttrykket som skriver ut tre verdier, dvs. pp-p, *pp-a, *pp. La oss beregne hver enkelt av dem.
- pp = 304, p = 300 => pp - p = (304 - 300)/2 => pp-p = 2, dvs. 2 vil bli skrevet ut.
- pp = 304, *pp = 206, a = 200 => *pp-a = (206 - 200)/2 = 3, dvs. 3 vil bli skrevet ut.
- pp = 304, *pp = 206, *(*pp) = 409, dvs. 409 vil bli skrevet ut.
Derfor, som et resultat av linje 9, vil utgangen 2, 3, 409 bli skrevet ut på konsollen. På linje 10 skrives ++**pp. i henhold til assosiativitetsregelen kan dette skrives om som, (++(*(*(pp)))). pp = 304, *pp = 206, **pp = 409, ++**pp => *pp = *pp + 1 = 410. Med andre ord, a[3] = 410.
På linje 11 er det igjen skrevet uttrykket som skriver ut tre verdier, dvs. pp-p, *pp-a, *pp. La oss beregne hver og en av dem.
- pp = 304, p = 300 => pp - p = (304 - 300)/2 => pp-p = 2, dvs. 2 vil bli skrevet ut.
- pp = 304, *pp = 206, a = 200 => *pp-a = (206 - 200)/2 = 3, dvs. 3 vil bli skrevet ut.
- På linje 8, **pp = 410.
Som et resultat av linje 9 vil utdataene 2, 3, 410 derfor skrives ut på konsollen.
java-streng av array
Til slutt vil resultatet av det komplette programmet bli gitt som:
Produksjon
1 1 206 2 2 300 2 3 409 2 3 410