English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In questo tutorial, imparerai i puntatori. Cos'è un puntatore, come usarlo e gli errori comuni che potresti incontrare con l'aiuto di esempi.
I puntatori sono una funzionalità potente del linguaggio C e C++ e, prima di studiare i puntatori, è utile familiarizzare con gli indirizzi nel programming C.
Se c'è una variabile var nel programma, &var fornirà il suo indirizzo nella memoria.
Quando usiamo la funzione scanf(), abbiamo usato più volte gli indirizzi.
scanf("%d", &var);
In questo caso, il valore inserito dall'utente è memorizzato nell'indirizzo della variabile var. Facciamo un esempio pratico.
#include <stdio.h> int main() { int var = 5; printf("var: %d\n", var); // Attenzione all'uso di & prima di var printf("address of var: %p", &var); return 0; }
Risultato dell'output
var: 5 var indirizzo: 2686778
Attenzione:Quando esegui il codice sopra, potresti ottenere altri indirizzi.
I puntatori (variabili puntatori) sono variabili speciali utilizzate per memorizzare indirizzi invece di valori.
Ecco come dichiariamo i puntatori.
int* p;
In questo caso, abbiamo già dichiarato un puntatore di tipo int p.
Puoi dichiarare i puntatori anche in questo modo.
int *p1; int *p2;
Facciamo un altro esempio di dichiarazione di puntatori.
int* p1, p2;
In questo caso, abbiamo dichiarato un puntatore p1 e una variabile comune p2.
Facciamo un esempio.
int *pc, c; c = 5; pc = &c;
In questo caso, 5 è stato assegnato alla variabile c. E l'indirizzo di c è stato assegnato al puntatore pc.
Per ottenere il valore del contenuto puntato dal puntatore, utilizziamo l'operatore di de-referenziazione (*). Ad esempio:
int *pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5
In questo caso, l'indirizzo di c è stato assegnato al puntatore pc. Per ottenere il valore memorizzato in quell'indirizzo, abbiamo utilizzato *pc.
Facciamo un esempio.
int *pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Output: 1
Abbiamo già assegnato l'indirizzo di c al puntatore pc.
Poi, cambiamo il valore di c in 1. Poiché l'indirizzo di pc e c sono gli stessi, *pc diventa 1.
Lasciatoci fare un altro esempio.
int *pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Output: 1 printf("%d", c); // Output: 1
Abbiamo già assegnato l'indirizzo di c al puntatore pc.
Poi, cambiamo il valore di *pc in 1. Poiché l'indirizzo di pc e c sono gli stessi, c è uguale a 1.
Lasciatoci fare un altro esempio.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Output: -15
All'inizio, viene assegnato l'indirizzo c al puntatore pc con pc = &c;. Poiché c è 5, *pc ci dà 5.
Poi, viene assegnato l'indirizzo d al puntatore pc con pc = &d;. Poiché d è -15, *pc ci dà -15.
Facciamo un esempio pratico.
#include <stdio.h> int main() { int *pc, c; c = 22; printf("Indirizzo di c: %p\n", &c); printf("Valore di c: %d\n\n", c); // 22 pc = &c; printf("Indirizzo del puntatore pc: %p\n", pc); printf("Contenuto del puntatore pc: %d\n\n", *pc); // 22 c = 11; printf("Indirizzo del puntatore pc: %p\n", pc); printf("Contenuto del puntatore pc: %d\n\n", *pc); // 11 *pc = 2; printf("Indirizzo di c: %p\n", &c); printf("Valore di c: %d\n\n", c); // 2 return 0; }
Risultato dell'output
Indirizzo di c: 003FFBF8 Valore di c: 22 Indirizzo del puntatore pc: 003FFBF8 Contenuto del puntatore pc: 22 Indirizzo del puntatore pc: 003FFBF8 Contenuto del puntatore pc: 11 Indirizzo di c: 003FFBF8 Valore di c: 2
Uso del programma
int *pc, c;
Qui viene creato un puntatore pc e una variabile comune c, entrambi di tipo int. Poiché pc e c non sono inizializzati all'inizio, il puntatore pc punta a un indirizzo non definito o a un indirizzo casuale. La variabile c ha un indirizzo, ma contiene valori di spazzatura casuali.
c = 22;
Questo assegna il valore 22 alla variabile c, ovvero 22 viene memorizzato nella memoria della variabile c.
pc = &c;
Questo assegnerà l'indirizzo della variabile c al puntatore pc.
c = 11;
Questo assegnerà 11 alla variabile c.
*pc = 2;
Questo modificarà il valore della posizione di memoria puntata dal puntatore pc a 2.
Supponiamo che tu voglia che il puntatore pc punti all'indirizzo di c. Poi,
int c, *pc; //pc è un indirizzo, ma c non lo è pc = c; // Errore //&c è un indirizzo, ma *pc non lo è *pc = &c; // Errore //&c e pc sono indirizzi pc = &c; //Valore di c e *pc *pc = c;
Questo è un esempio che i principianti della sintassi dei puntatori spesso trovano confuso.
#include <stdio.h> int main() { int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; }
Perché non si è verificato alcun errore durante l'uso di int *p = &c;?
Questo è perché
int *p = &c;
相当于
int *p: p = &c;
在这两种情况下,我们都创建了一个指针p(不是*p)并给它赋值&c。
为了避免这种混乱,我们可以使用如下语句:
int* p = &c;
现在您知道了什么是指针,您将在下一个教程中学习指针与数组的关系。