Beh... da spiegare è un pò difficile ma ci provo e spero di non sbagliare.
Una variabile è l'allocazione della memoria per l'inserimento di dati:
char prova[5];
In questo modo alla variabile char prova sono riservati 5 bytes in memoria.
Con i puntatori, punti una variabile ad un indirizzo di memoria:
char *prova2 = &prova;
In questo modo prova2 è puntato a prova, e modificando prova2 modifichi anche prova, proprio perchè l'indirizzo di memoria è uguale.
Ora, per allocare uno spazio di memoria ad un puntatore si usa malloc():
char *prova = (char *)malloc(5);
In questo modo puoi usare il puntatore come una variabile, perchè gli è stata allocata la memoria di 5 bytes.
void modifica(char *prova) {
strcpy(prova, "prova");
}
int main(void) {
char prova[5];
strcpy(prova, "asd");
modifica(&prova);
}
In questo modo modifica quella stessa variabile prova da "asd" a "prova", poichè con &prova gli hai passato l'indirizzo di memoria.
Se invece facevi modifica(char prova[]) e facevi modifica(prova) copiavi la variabile prova del main() e la passavi alla funziona come nuova variabile ma con contenuto uguale, quindi la modifica sarebbe avvenuta solo all'interno della funzione e non avrebbe modificato la variabile originale.
Spero di essere stao chiaro![]()