English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial di base del linguaggio C

Controllo dei flussi del linguaggio C

C语言函数

C语言数组

C语言指针

C语言字符串

Strutture del linguaggio C

File del linguaggio C

Altro del linguaggio C

Manuale di riferimento del linguaggio C

C语言指针

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.

Indirizzamento in 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.

C语言指针

I puntatori (variabili puntatori) sono variabili speciali utilizzate per memorizzare indirizzi invece di valori.

Sintassi dei puntatori

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.

Assegna un indirizzo al puntatore

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.

Ottieni il valore puntato dal puntatore

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.

Modificare il valore puntato dal puntatore

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.

Esempio: come funzionano i puntatori

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

  1. 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.  

  2. c = 22;

    Questo assegna il valore 22 alla variabile c, ovvero 22 viene memorizzato nella memoria della variabile c.
     

  3. pc = &c;

    Questo assegnerà l'indirizzo della variabile c al puntatore pc.
     

  4. c = 11;

    Questo assegnerà 11 alla variabile c.
     

  5. *pc = 2;

    Questo modificarà il valore della posizione di memoria puntata dal puntatore pc a 2.

Errori comuni durante l'uso dei puntatori

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;

现在您知道了什么是指针,您将在下一个教程中学习指针与数组的关系。