logo

C: punter a punter (punter doble)

Requisit previ: Punters en C

El punter a un punter en C s'utilitza quan volem emmagatzemar l'adreça d'un altre punter. El primer punter s'utilitza per emmagatzemar l'adreça de la variable. I el segon punter s'utilitza per emmagatzemar l'adreça del primer punter. Per això també es coneixen com punters dobles . Podem utilitzar un punter a un punter per canviar els valors dels punters normals o crear una matriu 2D de mida variable. Un punter doble ocupa la mateixa quantitat d'espai a la pila de memòria que un punter normal.



Declaració de punter a un punter en C

Declarar punter a punter és similar a declarar un punter a C. La diferència és que hem de posar un '*' addicional abans del nom del punter.

cadena java concatenada
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.>

El diagrama anterior mostra la representació de memòria d'un punter a un punter. El primer punter ptr1 emmagatzema l'adreça de la variable i el segon punter ptr2 emmagatzema l'adreça del primer punter.

Exemple de punter doble en 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;> }>

>

>

Sortida

Value of var = 789 Value of var using single pointer = 789 Value of var using double pointer = 789>

Com funciona el punter doble?

El funcionament del punter doble es pot explicar mitjançant la imatge anterior:

  • El punter doble es declara utilitzant la sintaxi mostrada a dalt.
  • Després d'això, emmagatzemem l'adreça d'un altre punter com el valor d'aquest nou punter doble.
  • Ara, si volem manipular o anul·lar la referència a qualsevol dels seus nivells, hem d'utilitzar l'operador Asterisk (*) el nombre de vegades que volem baixar del nivell.

Mida del punter a punter en C

En el llenguatge de programació C, un punter doble es comporta de manera similar a un punter normal en C. Per tant, la mida de la variable de punter doble sempre és igual als punters normals. Podem verificar-ho mitjançant el programa C següent.

Exemple 1: Programa C per trobar la mida d'un punter a un punter.

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;> }>

onclick javascript

>

>

Sortida

 Size of normal Pointer: 8 Size of Double Pointer: 8>

Nota: La sortida del codi anterior també depèn del tipus de màquina que s'utilitza. La mida d'un punter no es fixa en el llenguatge de programació C i depèn d'altres factors com l'arquitectura de la CPU i el sistema operatiu utilitzat. Normalment, per a un sistema operatiu de 64 bits, la mida serà de 8 bytes i per a un sistema operatiu de 32 bits, la mida serà de 4 bytes.

Aplicació de punters dobles en C

A continuació es mostren els usos principals del punter a punters a C:

  • S'utilitzen en l'assignació de memòria dinàmica de matrius multidimensionals.
  • Es poden utilitzar per emmagatzemar dades de diversos nivells, com ara el paràgraf del document de text, les frases i la semàntica de les paraules.
  • S'utilitzen en estructures de dades per manipular directament l'adreça dels nodes sense copiar-les.
  • Es poden utilitzar com a arguments de funció per manipular l'adreça emmagatzemada al punter local.

Apuntadors multinivell en C

Els punters dobles no són els únics punters multinivell compatibles amb el llenguatge C. Què passa si volem canviar el valor d'un punter doble?

En aquest cas, podem utilitzar un punter triple, que serà un punter a un punter a un punter, és a dir, int ***t_ptr.

Sintaxi del punter triple

  pointer_type *** pointer_name;>

De la mateixa manera, per canviar el valor d'un punter triple podem utilitzar un punter a un punter a un punter a un punter (Four level Pointer). En altres paraules, podem dir que per canviar el valor d'una variable de nivell – x podem utilitzar un punter de nivell – x+1. I aquest concepte es pot ampliar encara més.

patró de disseny del constructor

Nota : Podem utilitzar qualsevol punter de nivell en C. No hi ha cap restricció, però fa que el programa sigui molt complex i vulnerable als errors.

Cal llegir- Apuntador de funció en C