Se scrivessi
#include <stdio.h>
int main()
{
const int a = 0;
a=2:
return 0;
}
avrei un errore di compilazione:
gcc -Wpedantic -c "punta1.c" (nella cartella: /home/max/C)
punta1.c: In function ‘main’:
punta1.c:6:5: error: assignment of read-only variable ‘a’
a=2;
^
Compilazione fallita.
che non è nemmeno un warning, ho proprio compilazione fallita, impossibile modificare il valore
se invece scrivessi:
#include <stdio.h>
int main()
{
const int a = 0;
int * b=&a;
*b=1;
return 0;
}
ho una cosa così:
gcc -Wall -o "punta1" "punta1.c" (nella cartella: /home/max/C)
punta1.c: In function ‘main’:
punta1.c:6:12: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
int * b=&a;
^
Compilazione terminata correttamente.
che è solo un warning, infatti compila ma mi segnala che sto assegnando ad un puntatore un indirizzo di variabile const
notare che non ho errore quando poi scrivo nell'area di memoria, è nell'inizializzazione del puntatore il warning, non nella scrittura in memoria
e stampa
#include <stdio.h>
int main()
{
const int a = 0;
printf("la variabile vale: %d\n",a);
int * b=&a;
*b=1;
printf("la variabile vale: %d\n",a);
return 0;
}
compila
gcc -Wpedantic -c "punta1.c" (nella cartella: /home/max/C)
punta1.c: In function ‘main’:
punta1.c:7:12: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
int * b=&a;
^
Compilazione terminata correttamente.
e stampa
max@LastMax:~/C$ ./punta1
la variabile vale: 0
la variabile vale: 1
max@LastMax:~/C$
e quindi la questione che la variabile non si può modificare è chiusa, grazie
torniamo all'esempio del mio primo programma
#include <stdio.h>
int main()
{
const int a = 0;
printf("la variabile vale: %d\n",a);
* (int *) &a = 1;
printf("la variabile Vale: %d\n",a);
return 0;
}
dove casto a puntatore a intero l'indirizzo della costante e lo uso per alterare la costante
compila, senza warning (è questa la domanda)
gcc -Wall -o "punta1" "punta1.c" (nella cartella: /home/max/C)
Compilazione terminata correttamente.
ed esegue
max@LastMax:~/C$ ./punta1
la variabile vale: 0
la variabile Vale: 1
max@LastMax:~/C$
come si vede ho cambiato una maiuscola, per dimostrare che il programma è l'ultimo compilato