Intelligenza Artificiale

A un certo punto non fu più la biologia a dominare il destino dell'uomo, ma il prodotto del suo cervello: la cultura.
Cosicché: "Le uniche leggi della materia sono quelle che la nostra mente deve architettare e le uniche leggi della mente sono architettate per essa dalla materia".
JAMES CLERK MAXWELL

Puntatori


Puntatori in C

In linguaggio C, i puntatori sono variabili speciali che contengono l'indirizzo di memoria di un'altra variabile. Possono essere utilizzati per manipolare direttamente i dati in memoria e offrono una flessibilità significativa nel gestire le informazioni.

Dichiarazione di Puntatori

Per dichiarare un puntatore, è necessario specificare il tipo di dato a cui punterà il puntatore. Ad esempio, un puntatore a un intero (`int`) sarà dichiarato come segue:

int* puntatoreInt;

Assegnazione di Indirizzo

Per assegnare l'indirizzo di memoria di una variabile a un puntatore, utilizziamo l'operatore di indirizzo `&`:

int variabile = 42;
int* puntatoreInt = &variabile;


Ora `puntatoreInt` contiene l'indirizzo di memoria della variabile `variabile`.

Assegnazione di Indirizzo

Per accedere al valore puntato da un puntatore, utilizziamo l'operatore di dereferenziazione `*`.

printf("Valore della variabile: %d\n", *puntatoreInt);

Questo stamperà il valore della variabile a cui il puntatore sta puntando.

Modifica del Contenuto

Possiamo utilizzare il puntatore per modificare il valore della variabile a cui punta:
 
*puntatoreInt = 55;
printf("Nuovo valore della variabile: %d\n", variabile);

Ora la variabile `variabile` sarà 55.

Puntatori a Void

Il tipo di puntatore `void*` è un tipo generico che può puntare a qualsiasi tipo di dato. Può essere utile quando il tipo di dato specifico non è noto in anticipo.

void* puntatoreGenerico;
int numero = 10;
puntatoreGenerico = №

Aritmetica dei Puntatori

È possibile eseguire operazioni aritmetiche sui puntatori, ad esempio incrementare o decrementare un puntatore:

int array[] = {1, 2, 3, 4, 5};
int* p = array;

printf("%d\n", *p);  // Stampa il valore del primo elemento
p++;                 // Incrementa il puntatore
printf("%d\n", *p);  // Stampa il valore del secondo elemento

Allocazione Dinamica di Memoria

I puntatori sono spesso utilizzati in combinazione con le funzioni `malloc`, `calloc`, e `free` per l'allocazione e la deallocazione dinamica della memoria:

int* puntatoreDinamico = malloc(sizeof(int));
*puntatoreDinamico = 100;
free(puntatoreDinamico);  // Dealloca la memoria quando non è più necessaria

È importante gestire attentamente la memoria allocata dinamicamente per evitare perdite di memoria.