logo

C Punters

El punter en llenguatge C és una variable que emmagatzema l'adreça d'una altra variable. Aquesta variable pot ser de tipus int, char, array, function o qualsevol altre punter. La mida del punter depèn de l'arquitectura. Tanmateix, a l'arquitectura de 32 bits la mida d'un punter és de 2 bytes.

Considereu l'exemple següent per definir un punter que emmagatzema l'adreça d'un nombre enter.

 int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer. 

Declaració d'un punter

El punter en llenguatge c es pot declarar mitjançant * (símbol d'asterisc). També es coneix com a punter d'indirecció utilitzat per desreferenciar un punter.

 int *a;//pointer to int char *c;//pointer to char 

Exemple de punter

A continuació es mostra un exemple d'ús de punters per imprimir l'adreça i el valor.

exemple de punter

Com podeu veure a la figura anterior, la variable punter emmagatzema l'adreça de la variable número, és a dir, fff4. El valor de la variable numèrica és 50. Però l'adreça de la variable punter p és aaa3.

Amb l'ajuda de * ( operador indirecte ), podem imprimir el valor de la variable punter p.

punt java

Vegem l'exemple del punter tal com s'explica per a la figura anterior.

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

Sortida

prova catch block a java
 Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50 

Punter a la matriu

 int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr. 

Apuntador a una funció

 void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function 

Apuntador a l'estructura

 struct st { int i; float f; }ref; struct st *p = &ref; 
c punters

Avantatge del punter

1) Apuntador redueix el codi i millora el rendiment , s'utilitza per recuperar cadenes, arbres, etc. i s'utilitza amb matrius, estructures i funcions.

2) Podem retorna diversos valors d'una funció utilitzant el punter.

3) Et fa capaç accedir a qualsevol ubicació de memòria a la memòria de l'ordinador.

Ús del punter

Hi ha moltes aplicacions de punters en llenguatge c.

1) Assignació de memòria dinàmica

En el llenguatge c, podem assignar memòria dinàmicament mitjançant les funcions malloc() i calloc() on s'utilitza el punter.

2) Matrius, funcions i estructures

Els punters en llenguatge c s'utilitzen àmpliament en matrius, funcions i estructures. Redueix el codi i millora el rendiment.

Adreça de l'operador (&).

L'adreça de l'operador '&' retorna l'adreça d'una variable. Però, hem d'utilitzar %u per mostrar l'adreça d'una variable.

itera el mapa en java
 #include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; } 

Sortida

 value of number is 50, address of number is fff4 

Punter NULL

Un punter al qual no se li assigna cap valor però NULL es coneix com a punter NULL. Si no teniu cap adreça per especificar al punter en el moment de la declaració, podeu assignar un valor NULL. Proporcionarà un millor enfocament.

 int *p=NULL; 

A la majoria de biblioteques, el valor del punter és 0 (zero).

Programa punter per intercanviar dos números sense utilitzar la tercera variable.

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

Sortida

 Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10 

Lectura d'apunts complexos

Hi ha diverses coses que s'han de tenir en compte en llegir els punters complexos en C. Vegem la precedència i l'associativitat dels operadors que s'utilitzen pel que fa als punters.

OperadorPrecedènciaAssociativitat
(), []1Esquerra a dreta
*, identificador2De dreta a esquerra
Tipus de dades3-

Aquí, hem de notar que,

  • (): Aquest operador és un operador de parèntesi utilitzat per declarar i definir la funció.
  • []: aquest operador és un operador de subíndex de matriu
  • * : aquest operador és un operador de punter.
  • Identificador: És el nom del punter. A això se li donarà sempre la prioritat.
  • Tipus de dades: el tipus de dades és el tipus de variable a la qual vol apuntar el punter. També inclou el modificador com signed int, long, etc.).

Com llegir el punter: int (*p)[10].

Per llegir el punter, hem de veure que () i [] tenen la mateixa precedència. Per tant, aquí cal considerar la seva associativitat. L'associativitat és d'esquerra a dreta, de manera que la prioritat passa a ().

Dins del claudàtor (), l'operador del punter * i el nom del punter (identificador) p tenen la mateixa prioritat. Per tant, la seva associativitat s'ha de considerar aquí que és de dreta a esquerra, de manera que la prioritat va a p, i la segona prioritat va a *.

Característiques de java8

Assigna la 3a prioritat a [] ja que el tipus de dades té l'última prioritat. Per tant, el punter es veurà com el següent.

  • caràcter -> 4
  • * -> 2
  • p -> 1
  • [10] -> 3

El punter es llegirà ja que p és un punter a una matriu de nombres enters de mida 10.

Exemple

Com llegir el següent punter?

 int (*p)(int (*)[2], int (*)void)) 

Explicació

Aquest punter es llegirà ja que p és un punter a aquesta funció que accepta el primer paràmetre com a punter a una matriu unidimensional d'enters de mida dos i el segon paràmetre com a punter a una funció, el paràmetre és nul i el tipus de retorn és el nombre sencer.