sabato 21 maggio 2011

Corso Linguaggio C #7: Puntatori

Oggi voglio trattare un argomento fondamentale della programmazione ossia i puntatori. Ho deciso di scrivere un post perchè tantissimi ragazzi che studiano programmazione trovano difficoltà nell'imparare ad usarli.



Già ho fatto uso dei puntatori nel post riguardante le funzioni e le procedure ma non ho ben spiegato come si comportano realmente.

Volendo dare una breve definizione, un puntatore è una variabile che punta ad un'altra variabile del nostro programma. In pratica se una normale variabile contiene un carattere oppure un numero, un puntatore contiene l'indirizzo di memoria di un'altra variabile.

Scriviamo subito un piccolo esempio:

int a=5,b;
int *c;
c=&a; //ora c punta ad a
b=*c; //ora b vale 5
printf("%d",b);


Leggendo il programma vediamo che la variabile puntatore c punta all'indirizzo di a, poi alla variabile b viene assegnato il valore puntato da c e infine con la printf visualizziamo il valore di b che sarà uguale a 5.

L'operatore unario * è l'operatore di deferenziazione o deferimento e serve per indicare che quella determinata variabile è un puntatore.

Quando si iniziano a studiare i puntatori la domanda classica è "Ma a cosa servono?". Se programmate da poco, i puntatori verranno usati pochissime volte ma con il tempo capirete che non sono affatto inutili.

Inizialmente userete i puntatori nelle funzioni di tipo void, infatti queste funzioni vengono usate quando dobbiamo restituire più di un valore di output. Nella lezione precedente ho usato questo esempio di procedura:

#include <stdio.h>
void somma_interi (int a, int b, int c, int d, int *res1, int *res2); //dichiarazione della procedura
void main ()
{
int a,b,c,d,res1,res2;
printf("Inserisci quattro numeri interi: ");
scanf("%d%d%d%d",&a,&b,&c,&d);
somma_interi(a,b,c,d,&res1,&res2); //chiamo la procedura
printf("La somma dei due numeri e' di %d e %d\n",res1,res2);
getch();
}

void somma_interi (int a, int b, int c, int d, int *res1, int *res2) //scrivo la procedura
{
*res1=a+b;
*res2=c+d;
}


Il programma permette di inserire in input quattro numeri e restituisce in output la somma tra il primo e il secondo numero e la somma tra il terzo e il quarto numero. Le due somme vengono calcolate tramite una void function.

Le due variabili dei risultati vengono passati alla function in questo modo:

somma_interi(a,b,c,d,&res1,&res2);

Questo significa che stiamo passando gli indirizzi di memoria di quelle variabili ed infatti nella function quelle due variabili sono dei puntatori.

void somma_interi (int a, int b, int c, int d, int *res1, int *res2) //scrivo la procedura
{
*res1=a+b;
*res2=c+d;
}

Queste due variabili puntatori puntano all'indirizzo di memoria delle due variabili del main (i nomi dei puntatori nella function e delle due variabili del main possono non essere uguali, il risultato sarà sempre lo stesso), quindi andando ad inserire un valore numerico in realtà quei valori vengono inseriti nelle variabili puntate dai puntatori ossia le variabili del main.

Devo ammettere che come ragionamento è molto contorto ma facendo molta pratica si riesce ad usarli senza tante difficoltà.

Un consiglio è quelli di non sottovalutare questi argomenti perchè anche se nell'immediato possono sembrare scoccianti, andando avanti con la programmazione ed affrontando argomenti come le liste, alberi e via dicendo, l'uso dei puntatori diventa fondamentale per poter programmare.

Se avete qualche dubbio potete lasciare un messaggio qui nel blog oppure contattarmi in privato tramite email.

A presto!

1 commenti:

Anonimo ha detto...

Invito i lettori del blog a visitare il manuale presente all'indirizzo
thpitagora.altervista.org/puntatori.pdf

Il sito tratta dei puntatori nel linguaggio C
Cordiali saluti
Francesco

Posta un commento

Altri articoli interessanti