Ciao, prova a dare un'occhiata al codice seguente, spero ti aiuti a capire meglio il giochino:
Codice: Seleziona tutto
#include<stdio.h>
int main()
{
int num=-999;
int *ptr;
int **ptr1;
ptr=#
ptr1=&ptr;
printf("La variabile num è memorizzata all'indirizzo %p, ha valore: %d, e occupa %ld bytes\n",&num, num, sizeof(num));
printf("La variabile ptr è un puntatore a un intero. ptr è memorizzata all'indirizzo %p, ha valore %p (la posizione in memoria di num) e occupa %ld bytes. Il valore puntato da ptr vale: %d\n",&ptr,ptr,sizeof(ptr),*ptr);
printf("La variabile ptr1 è un puntatore a un puntatore a un intero. ptr1 è memorizzata all'indirizzo %p, ha valore %p (la posizione in memoria di ptr) e occupa %ld bytes.\n", &ptr1, ptr1, sizeof(ptr1));
printf("Con *ptr1 estraggo il valore di quanto puntato da ptr1, che è a sua volta un indirizzo di memoria e vale: %p.\nCon **ptr1 ottengo il valore di quanto memorizzato in quest'ultimo indirizzo di memoria, che è un intero e che vale: %d\n",*ptr1,**ptr1);
printf("\nInserisci un numero intero: ");
scanf("%d",*ptr1);
printf("\nAggiornamento della situazione:\n");
printf("La funzione scanf ha memorizzato il valore che hai inserito nell'indirizzo di memoria fornito come argomento, ossia %p\n", *ptr1);
printf("La variabile num è sempre memorizzata all'indirizzo %p, ma adesso ha valore: %d\n",&num, num);
printf("La variabile ptr è sempre memorizzata all'indirizzo %p, ha valore %p e il valore da lei puntato vale: %d\n",&ptr,ptr,*ptr);
printf("La variabile ptr1 è sempre memorizzata all'indirizzo %p e ha sempre valore %p.\n", &ptr1, ptr1);
printf("Il valore puntato ptr1 vale sempre %p, mentre il valore puntato dall'indirizzo di memoria puntato da ptr1, che è un intero, vale ora: %d e coincide con il valore puntato da ptr:%d\n",*ptr1,**ptr1,*ptr);
return 0;
}
Dovresti ottenere, eseguendo il programma, qualcosa tipo:
La variabile num è memorizzata all'indirizzo 0x7ffcde61a094, ha valore: -999, e occupa 4 bytes
La variabile ptr è un puntatore a un intero. ptr è memorizzata all'indirizzo 0x7ffcde61a098, ha valore 0x7ffcde61a094 (la posizione in memoria di num) e occupa 8 bytes. Il valore puntato da ptr vale: -999
La variabile ptr1 è un puntatore a un puntatore a un intero. ptr1 è memorizzata all'indirizzo 0x7ffcde61a0a0, ha valore 0x7ffcde61a098 (la posizione in memoria di ptr) e occupa 8 bytes.
Con *ptr1 estraggo il valore di quanto puntato da ptr1, che è a sua volta un indirizzo di memoria e vale: 0x7ffcde61a094.
Con **ptr1 ottengo il valore di quanto memorizzato in quest'ultimo indirizzo di memoria, che è un intero e che vale: -999
Inserisci un numero intero: 45
Aggiornamento della situazione:
La funzione scanf ha memorizzato il valore che hai inserito nell'indirizzo di memoria fornito come argomento, ossia 0x7ffcde61a094
La variabile num è sempre memorizzata all'indirizzo 0x7ffcde61a094, ma adesso ha valore: 45
La variabile ptr è sempre memorizzata all'indirizzo 0x7ffcde61a098, ha valore 0x7ffcde61a094 e il valore da lei puntato vale: 45
La variabile ptr1 è sempre memorizzata all'indirizzo 0x7ffcde61a0a0 e ha sempre valore 0x7ffcde61a098.
Il valore puntato ptr1 vale sempre 0x7ffcde61a094, mentre il valore puntato dall'indirizzo di memoria puntato da ptr1, che è un intero, vale ora: 45 e coincide con il valore puntato da ptr:45