Come abbiamo visto le scatole sono caratterizzate dal tipo del contenuto e
da un nome, a questo punto è possibile considerare i nomi delle
scatole come un altro tipo di dato del linguaggio.
Pertanto i nomi delle scatole possono essere immagazzinati in altre
scatole, confrontati per uguaglianza, differenza, .... Inoltre se si
assumesse che hanno una struttura di ordine discreto, è anche
possibile trovare il nome successivo o quello precedente.
I nomi delle scatole sono proprio i valori del tipo puntatori.
Consideriamo la seguente situazione
La scatola (variabile) MARIO contiene il nome di
un'altra scatola
(LUIGI) e
quindi si dice che punta a LUIGI,
da qui nasce il nome di
puntatori.
La scatola MARCO contiene invece il nome nullo (cioè un
elemento speciale che non è il nome di alcuna scatola), o il
puntatore nullo (non punta a
niente).
type T = puntatore a TYPE'in genere vi possono essere delle restrizioni sul tipo TYPE'.
int * p, * p2; /*due variabili di tipo puntatore a intero*/ char * c, * c2; /*due variabili di tipo puntatore a carattere*/
int x,y; char a,b;
p = & x; x = 3; /*p contiene l'indirizzo di x (punta a x), x contiene 3*/
c = &b ; a = 'a'; b = 'b';
p = &y;
if(&x == &y) printf("non puo\' essere\n");
else printf("chiaramente sono diversi\n");
p2 = p;
p = &y;
a = * c; /* ora a contiene 'b'*/
*p = 4; /*corrisponde ad assegnare 4 a y*/
c = c2; /*errore c2 non e' inizializzato*/
c = p; c = a; /*errori di tipo*/
#include <stdio.h>
main(){
float *x, *y, *z; /* tre variabili di tipo puntatore a float*/
float a, b, c; /* tre variabili di tipo float */
x = &a ; /* x contiene il puntatore (indirizzo) di a */
*x = 1.1; /* a contiene 1.1 */
y = &b ; /* y contiene il puntatore (indirizzo) di b */
b = 1.1; /* b contiene 1.1 */
if(a == b) printf("i contenuti di a e b sono uguali\n");
if(*x == *y) printf("i contenuti dei puntatori contenuti in x e y sono uguali\n");
if(x == y) printf("i puntatori a (indirizzi di) a e a b sono uguali PROBLEMA!\n");
else printf("i puntatori a (indirizzi di) a e a b sono diversi!\n");
c = a + *y;
printf("il valore di c e\' %f e deve essere 2.2\n",c);
y = &c;
c = a + *y;
printf("il valore di c e\' %f e deve essere 3.3\n",c);
}
Il suo output è
i contenuti di a e b sono uguali i contenuti dei puntatori contenuti in x e y sono uguali i puntatori a (indirizzi di) a e a b sono diversi! il valore di c e' 2.200000 e deve essere 2.2 il valore di c e' 3.300000 e deve essere 3.3