C/Vettori e puntatori/Puntatori: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Gian BOT (discussione | contributi)
m sostituzione tag obsoleti
Nessun oggetto della modifica
Etichetta: Editor wikitesto 2017
 
Riga 11:
Un puntatore si dichiara nel seguente modo:
 
<sourcesyntaxhighlight lang="c">
int *a;
</syntaxhighlight>
</source>
 
Si noti l'asterisco prima del nome del puntatore.
 
<sourcesyntaxhighlight lang="c">
int *a, b;
</syntaxhighlight>
</source>
 
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:
 
<sourcesyntaxhighlight lang="c">
int *a, *b; // sia a che b sono puntatori a variabile intera
</syntaxhighlight>
</source>
 
È possibile creare {{IndexItem|puntatori, array}}array di puntatori:
 
<sourcesyntaxhighlight lang="c">
int *a[5];
</syntaxhighlight>
</source>
 
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.
 
<sourcesyntaxhighlight lang="c">
int main (void)
{
Riga 47:
a = &b;
}
</syntaxhighlight>
</source>
 
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:
 
<sourcesyntaxhighlight lang="c">
int *a, *c, b;
Riga 59:
a = &b;
c = a; // c punta a b
</syntaxhighlight>
</source>
 
==={{IndexItem|puntatori, accesso}}Accesso===
Riga 65:
Dopo aver dichiarato e assegnato un puntatore ad una variabile, è possibile usarlo.
 
<sourcesyntaxhighlight lang="c">
int main (void)
{
Riga 74:
"stessa variabile puntata da b vale %d.", *a, *b);
}
</syntaxhighlight>
</source>
 
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.
 
<sourcesyntaxhighlight lang="c">
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>
</source>
 
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:
 
<sourcesyntaxhighlight lang="c">
void doubleof(int *x); //prototipo
int main (void)
Riga 112:
*x = (* x) * 2;
}
</syntaxhighlight>
</source>
 
Questa piccola applicazione stamperà 4. Ecco come:
Riga 125:
NB la variabile passata dal main resterà INALTERATA.
 
<sourcesyntaxhighlight lang="c">
void doubleof (int); //prototipo
int main (void)
Riga 139:
x = x*2;
}
</syntaxhighlight>
</source>
 
RIASSUNTO:
Riga 162:
Per esempio:
 
<sourcesyntaxhighlight lang="c">
void doubleof(int *ilmioarray);
Riga 181:
ilmioarray[j] = ilmioarray[j]*2;
}
</syntaxhighlight>
</source>
 
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.
 
<sourcesyntaxhighlight lang="c">
void doubleof(int ilmioarray[]);
Riga 216:
ilmioarray[j]=ilmioarray[j]*2;
}
</syntaxhighlight>
</source>
=== 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 ====
<sourcesyntaxhighlight lang="c">
/* Il seguente codice per funzionare correttamente necessita di un compilatore che supporti
lo standard C99. */
Riga 277:
}
}
</syntaxhighlight>
</source>
 
=={{IndexItem|funzioni, puntatori a}}{{IndexItem|puntatori a funzioni}}Puntatori a funzioni==
Riga 284:
Il seguente esempio definisce, assegna e utilizza un puntatore a funzione:
 
<sourcesyntaxhighlight lang="c">
#include <stdio.h>
 
Riga 299:
return 0;
}
</syntaxhighlight>
</source>
 
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.
 
<sourcesyntaxhighlight lang="c">
#include <stdio.h>
int main (void)
Riga 321:
printf ("**p = %d", **pp); // stampa il contenuto di a
}
</syntaxhighlight>
</source>
il risultato è:
**p = 5