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.
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;
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.
Operador | Precedència | Associativitat |
---|---|---|
(), [] | 1 | Esquerra a dreta |
*, identificador | 2 | De dreta a esquerra |
Tipus de dades | 3 | - |
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.