C – Pointer to Pointer (Dobbelt Pointer)
Forudsætning: Pointer i C
Pointeren til en pointer i C bruges, når vi vil gemme adressen på en anden pointer. Den første pointer bruges til at gemme variablens adresse. Og den anden pointer bruges til at gemme adressen på den første pointer. Derfor er de også kendt som dobbelte pointere . Vi kan bruge en pegepind til en pegepind til at ændre værdierne af normale pointere eller oprette et 2-D-array i variabel størrelse. En dobbelt pointer optager den samme mængde plads i hukommelsesstakken som en normal pointer.
Erklæring om pointer til en pointer i C
At erklære Pointer til Pointer svarer til at erklære en pointer i C. Forskellen er, at vi skal placere et ekstra '*' før navnet på pointeren.
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.
Ovenstående diagram viser hukommelsesrepræsentationen af en pointer til en pointer. Den første pointer ptr1 gemmer adressen på variablen, og den anden pointer ptr2 gemmer adressen på den første pointer.
Eksempel på Double Pointer i C
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;> }> |
Produktion
Value of var = 789 Value of var using single pointer = 789 Value of var using double pointer = 789
Hvordan fungerer Double Pointer?
Funktionen af dobbelt-pointeren kan forklares ved hjælp af ovenstående billede:
- Dobbeltmarkøren erklæres ved hjælp af syntaksen vist ovenfor.
- Derefter gemmer vi adressen på en anden pointer som værdien af denne nye dobbelte pointer.
- Nu, hvis vi ønsker at manipulere eller dereferere til nogen af dets niveauer, skal vi bruge Asterisk ( * ) operator det antal gange ned på niveauet, vi ønsker at gå.
Størrelse af Pointer til Pointer i C
I programmeringssproget C opfører en dobbeltpointer sig på samme måde som en normal pointer i C. Så størrelsen af dobbeltpegevariablen er altid lig med de normale pointere. Vi kan verificere dette ved at bruge nedenstående C-program.
Eksempel 1: C Program til at finde størrelsen af en peger til en peger.
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;> }> |
Produktion
Size of normal Pointer: 8 Size of Double Pointer: 8
Bemærk: Outputtet af ovenstående kode afhænger også af den type maskine, der bruges. Størrelsen af en pointer er ikke fastsat i C-programmeringssproget, og det afhænger af andre faktorer som CPU-arkitektur og anvendt operativsystem. Normalt vil størrelsen for et 64-bit operativsystem være 8 bytes, og for et 32-bit operativsystem vil størrelsen være 4 bytes.
Anvendelse af dobbelte pointere i C
Følgende er de vigtigste anvendelser af pointer til pointere i C:
- De bruges i den dynamiske hukommelsesallokering af multidimensionelle arrays.
- De kan bruges til at gemme data på flere niveauer, såsom tekstdokumentets afsnit, sætninger og ordsemantik.
- De bruges i datastrukturer til direkte at manipulere nodernes adresse uden at kopiere.
- De kan bruges som funktionsargumenter til at manipulere adressen gemt i den lokale markør.
Multilevel Pointers i C
Double Pointers er ikke de eneste pointere på flere niveauer, der understøttes af C-sproget. Hvad hvis vi vil ændre værdien af en dobbeltpointer?
I dette tilfælde kan vi bruge en triple pointer, som vil være en pointer til en pointer til en pointer, dvs. int ***t_ptr.
Syntaks for Triple Pointer
pointer_type *** pointer_name;
Tilsvarende kan vi for at ændre værdien af en tredobbelt pointer bruge en pointer til en pointer til en pointer til en pointer (Fire level Pointer). Med andre ord kan vi sige, at for at ændre værdien af en niveau – x variabel kan vi bruge en niveau – x+1 pointer. Og dette koncept kan udvides yderligere.
Bemærk : Vi kan bruge en hvilken som helst niveaumarkør i C. Der er ingen begrænsning for det, men det gør programmet meget komplekst og sårbart over for fejl.
Skal læses - Funktionsmarkør i C