C/Vettori e puntatori/Puntatori: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m sostituzione tag obsoleti |
Nessun oggetto della modifica Etichetta: Editor wikitesto 2017 |
||
Riga 11:
Un puntatore si dichiara nel seguente modo:
<
int *a;
</syntaxhighlight>
Si noti l'asterisco prima del nome del puntatore.
<
int *a, b;
</syntaxhighlight>
Il precedente codice ''non'' genera due puntatori, ma uno solo, <code>a</code>. La variabile <code>b</code> è un intero, perché l'operatore * vale soltanto per la prima variabile. Qualora si desideri dichiarare più variabili di tipo puntatore, l'asterisco va ripetuto per ciascuna di esse:
<
int *a, *b; // sia a che b sono puntatori a variabile intera
</syntaxhighlight>
È possibile creare {{IndexItem|puntatori, array}}array di puntatori:
<
int *a[5];
</syntaxhighlight>
crea un array di cinque puntatori ad intero.
Riga 39:
Prima di utilizzare un puntatore, bisogna assegnarlo ad un indirizzo di memoria, ovvero fare in modo che esso ''punti'' ad una variabile.
<
int main (void)
{
Riga 47:
a = &b;
}
</syntaxhighlight>
Questo codice fa puntare il puntatore <code>a</code> alla variabile <code>b</code>. È importante notare che <code>a</code> non contiene il valore 10, ma l'indirizzo di memoria della variabile <code>b</code>, ottenuto tramite l'operatore &.
Riga 53:
È anche possibile fare in modo che un puntatore punti alla stessa variabile puntata da un altro puntatore:
<
int *a, *c, b;
Riga 59:
a = &b;
c = a; // c punta a b
</syntaxhighlight>
==={{IndexItem|puntatori, accesso}}Accesso===
Riga 65:
Dopo aver dichiarato e assegnato un puntatore ad una variabile, è possibile usarlo.
<
int main (void)
{
Riga 74:
"stessa variabile puntata da b vale %d.", *a, *b);
}
</syntaxhighlight>
Questo codice stamperà due volte il numero 10.
Riga 87:
Inoltre, è possibile calcolare la differenza tra due puntatori per capire quante celle di memoria ci sono fra i due. È possibile anche confrontarli per capire se puntano allo stesso indirizzo o meno.
<
if (p1 == p2) printf("p1 e p2 puntano allo stesso indirizzo di memoria.");
else printf("p1 e p2 puntano a due differenti indirizzi di memoria.");
</syntaxhighlight>
L'aritmetica dei puntatori permette anche [[C/Vettori e puntatori/Interscambiabilità tra puntatori e vettori|l'interscambiabilità tra puntatori e vettori]].
Riga 98:
Per esempio:
<
void doubleof(int *x); //prototipo
int main (void)
Riga 112:
*x = (* x) * 2;
}
</syntaxhighlight>
Questa piccola applicazione stamperà 4. Ecco come:
Riga 125:
NB la variabile passata dal main resterà INALTERATA.
<
void doubleof (int); //prototipo
int main (void)
Riga 139:
x = x*2;
}
</syntaxhighlight>
RIASSUNTO:
Riga 162:
Per esempio:
<
void doubleof(int *ilmioarray);
Riga 181:
ilmioarray[j] = ilmioarray[j]*2;
}
</syntaxhighlight>
restituisce:
Riga 196:
In questo metodo cambia solo la sintassi della funzione, ma il meccanismo è identico. Il vantaggio di questo meccanismo è che rende palese il fatto che ad una funzione verrà passato un array, ma se alla funzione fosse passato un puntatore non produrrebbe errori in fase di compilazione, ma si potrebbe comportare in modo insolito.
<
void doubleof(int ilmioarray[]);
Riga 216:
ilmioarray[j]=ilmioarray[j]*2;
}
</syntaxhighlight>
=== Passaggio di matrici a funzione ===
Ricapitolando una matrice in C altro non è che un vettore di vettore quindi viene naturale la dichiarazione:
Riga 239:
Tornando al caso delle matrici segue un esempio commentato sull'uso delle matrici dinamiche e passaggio a funzione.
==== Esempio passaggio matrici ====
<
/* Il seguente codice per funzionare correttamente necessita di un compilatore che supporti
lo standard C99. */
Riga 277:
}
}
</syntaxhighlight>
=={{IndexItem|funzioni, puntatori a}}{{IndexItem|puntatori a funzioni}}Puntatori a funzioni==
Riga 284:
Il seguente esempio definisce, assegna e utilizza un puntatore a funzione:
<
#include <stdio.h>
Riga 299:
return 0;
}
</syntaxhighlight>
Si noti che il tipo del puntatore "funz" è uguale al tipo dalla funzione "doubleof".
Riga 311:
È possibile definire anche puntatori ad altri puntatori che potrebbero a loro volta puntare a puntatori ecc.
<
#include <stdio.h>
int main (void)
Riga 321:
printf ("**p = %d", **pp); // stampa il contenuto di a
}
</syntaxhighlight>
il risultato è:
**p = 5
|