logo

Punter de desreferència en C

Sabem que la variable punter pot emmagatzemar l'adreça de memòria en llenguatge C i en aquest article, aprendrem a utilitzar aquest punter per accedir a les dades emmagatzemades a la ubicació de memòria apuntada pel punter.

Què és un punter?

En primer lloc, revisem què és un punter. Un punter és una variable que emmagatzema l'adreça de memòria d'una altra variable. El punter ens ajuda a manipular les dades de l'adreça de memòria que el punter apunta. A més, diversos punters poden apuntar a la mateixa memòria.



Considereu l'exemple següent,

int num = 10; int *ptr; ptr = #>

Hem emmagatzemat l'adreça del en una variable a la ptr punter, però ara, com accedir al valor emmagatzemat a la memòria a l'adreça assenyalada per ptr ? Aquí entra en joc la desreferenciació.

Punter de desreferència en C

L'accés o la manipulació del contingut que s'emmagatzema a l'adreça de memòria apuntada pel punter mitjançant l'operador de desreferenciació o indirecta (*) s'anomena desreferenciació del punter.



Desreferenciació del punter a C

com convertir de cadena a int

Sintaxi per desreferenciar un punter

Utilitzem l'operador d'indirecció (*) com a prefix per desreferenciar un punter:

 * ( pointer_name )>

Per modificar les dades emmagatzemades a la memòria, fem servir



 * ( pointer_name ) = new_value;>

Cal tenir en compte que el valor_nou ha de ser del mateix tipus que l'anterior.

Considereu els exemples anteriors on ptr apunta a si, t L'operador de desreferenciació * pot accedir al contingut de l'adreça de memòria. Ara, *ptr recuperarà el contingut emmagatzemat a l'adreça que és 10.

L'adreça i els valors de memòria num i ptr es veuran així.

Variable Adreça de memòria Valor
núm = 10 202020 10
202021
202022
202023
ptr = &núm 202024 – 202032 202020

Nota: Hem suposat que l'arquitectura de l'exemple anterior és adreçable per bytes, és a dir, la unitat mínima que té una adreça separada és un byte.

Exemples de desreferenciació de punters

Exemple 1:

Utilitzar un punter per accedir i modificar el valor d'una variable entera.

C




// C Program to illustrate the dereferencing of pointer> #include> int> main()> {> >// Declare integer variable number> >int> num = 10;> >// Declare pointer to store address of number> >int>* ptr = #> >// Print the value of number> >printf>(>'Value of num = %d '>, num);> >// Print Address of the number using & operator> >printf>(>'Address of num = %d '>, &num);> >// Print Address stored in the pointer> >printf>(>'Address stored in the ptr = %p '>, ptr);> >printf>(>'Dereference content in ptr using *ptr '>);> >// Access the content using * operator> >printf>(>'Value of *ptr = %d '>, *ptr);> >printf>(>'Now, *ptr is same as number '>);> >printf>(>'Modify the value using pointer to 6 '>);> >// Modify the content in the address to 6 using pointer> >*ptr = 6;> >// Print the modified value using pointer> >printf>(>'Value of *ptr = %d '>, *ptr);> >// Print the modified value using variable> >printf>(>'Value of number = %d '>, num);> >return> 0;> }>

>

>

Sortida

Value of num = 10 Address of num = 0x7ffe47d51b4c Address stored in the ptr = 0x7ffe47d51b4c Dereference content in ptr using *ptr Value of *ptr = 10 Now, *ptr is same as number Modify the value using pointer to 6 Value of *ptr = 6 Value of number = 6>

Exemple 2: Desreferenciar el punter doble

Els punters dobles també es poden desreferenciar utilitzant la mateixa lògica, però haureu d'utilitzar l'operador d'indirecció dues vegades: una per moure's al punter al qual apunta el punter doble i l'altra per accedir al valor real.

C




mètodes abstractes
// C program to dereference double pointer> #include> int> main()> {> >int> var = 10;> >int>* ptr = &var;> >// double pointer> >int>** dptr = &ptr;> >// dereferencing the double pointer> >printf>(>'Accesing value from double pointer using '> >'**dptr: %d'>,> >**dptr);> >return> 0;> }>

>

>

Sortida

Accesing value from double pointer using **dptr: 10>

Així, podem desreferenciar punters de qualsevol nivell.

Com funciona la desreferenciació?

Sempre que demanem al compilador que anul·li la referència d'un punter, fa tres coses:

  • Primer cerca l'adreça emmagatzemada al punter.
  • A continuació, cerca el tipus de punter perquè pugui deduir la quantitat de memòria a llegir. Per exemple, 4 byes per int, 1 byte per char, etc. També és la raó principal per la qual hem d'especificar el tipus de punter a la declaració tot i que la mida de cada punter d'un sistema és la mateixa.
  • Finalment, llegeix la memòria i retorna les dades emmagatzemades.

Nota: Del raonament anterior, també podem inferir que no podem desreferenciar el punter buit ja que la mida de les dades a les quals apunta és desconeguda. Per tant, hem de escriure el punter buit per desreferenciar-lo.