Scopo di questa esercitazione è di familiarizzarsi con la compilazione separata di files diversi contenenti functions, e con puntatori e array .
Al solito, si suggerisce di creare una directory apposita per i
files relativi a questa esercitazione.
Per i primi due esercizi, si consiglia
di usare l' opzione -Wall nel compilare i files (in modo da ottenere
tutti i messaggi di errore, a qualsiasi livello di gravita').
gcc -std=c99 -pedantic -Wall prog.c fun.c -o prog.xIl cui effetto e' di leggere i due files prog.c e fun.c, compilarli e creare dai rispettivi codici un file eseguibile dal nome prog.x. Provare a compilare ed eseguire.
E' anche possibile compilare in momenti diversi i due files. Il comando
compila il solo file fun.c senza tentare di eseguire le operazioni di linking. Il risultato di tale compilazione sarà un file di nome fun.o che contiene codice macchina non rilocato (non eseguibile). Questo potra' utilizzato per creare il file eseguibile, per esempio contestualmente alla compilazione di prog.c, con il comando
gcc -std=c99 -pedantic -Wall -c fun.c
gcc -std=c99 -pedantic -Wall -o prog.x prog.c fun.o
#include <stdio.h>Aggiungere anche la scrittura di
int main(void){
float a= 1.30, *ip, *iq;
ip = &a;
iq = ip;
printf("valore di a: %f,\
indirizzo di a: %p \n", a, &a);
return 0;
}
*ip, &ip, ipcon i convertitori di formato corretti ( %p per i puntatori e %f per i float ). (N.B. per scrivere il valore di un puntatore mediante printf sarebbe più corretto passare alla printf un cast esplicito del puntatore a puntatore void. Tuttavia, in assenza del cast, al peggio gcc scrive un messaggio di warning).
#include <stdio.h>
void fun(int, int *);
int main(void)
{
int u,v;
u=5;
v=2;
fun(u,&v);
printf("%d %d \n",u,v);
return 0;
}
void fun(int x, int *y)
{
int u=-10,v;
v = x + *y;
x = v - *y;
*y = x - u;
return;
}
#include <stdio.h>
int main(void)
{
int i=10,*ip;
float r=22.45,*rp;
double d=3.1416,*dp;
char c='a',*cp;
printf(" puntatore = %p, val= %d \n",ip,*ip);
printf(" puntatore = %p, val= %f \n",rp,*rp);
printf(" puntatore = %p, val= %lf \n",dp,*dp);
printf(" puntatore = %p, val= %c \n",cp,*cp);
return 0;
}
#include <stdio.h>Aggiungere anche la scrittura di
int main(void){
float a[]= { 1.30, 2.30, 3.30, 14.60}, *ip, *iq;
ip = &a[0];
iq = ip;
printf("valore di a[0]: %f,indirizzo di a[0]: %p \n", a[0], &a[0]);
return 0;
}
*ip, &ip, ip, a (con gli opportuni convertitori di formato)e interpretare i risultati. Aggiungere quindi anche la stampa di
*ip + 3 e *(ip+3)ed interpretare anche questi risultati.