- Dato il seguente programma
#include <stdio.h>
int main(){
float a= 1.30, *ip, *iq;
ip = &a;
iq = ip;
printf("valore di a: %f,
indirizzo di a: %p \n", a, &a);
return 0;
}
Aggiungere anche la scrittura di
*ip, &ip, ip
con i convertitori di formato corretti ( %p per i puntatori
e %f per i float ).
- Riscrivere il programma per la soluzione delle equazioni di
secondo grado in modo da utilizzare una function che accetti in input
(come argomenti) i tre coeficienti (reali) e
fornisca, attraverso due ulteriori argomenti, di tipo puntatori a
float, i valori delle due radici. Ricordiamo che se una
function ha un argomento puntatore, nell' invocazione della
function a quell' argomento deve corrispondere un indirizzo (che
poi e' il valore del puntatore). Es:
void funz( int a, int *b );
int main(){
int
z;
...
funz( 2, &z );
...
- Scrivere una function che abbia 2 argomenti di tipo puntatore e
che ritorni il puntatore al piu' grande dei due. Utilizzarla in un
programma che mediante scansione delle coppie di una lista di numeri ne
individui il massimo.
- Qual e' l' output di questo programma ?
#include <stdio.h>
void fun(int, int *);
int main()
{
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;
}
- Usare l' operatore sizeof
per ricavare l' occupazione di memoria d: un puntatore a interi,
un puntatore a float, uno a double e un puntatore a char.
- Nel seguente programma si vorrebbero scrivere i valori dei
puntatori e delle rispettive indirezioni per ciascuna variabile.
C'e' pero' un errore grave. Compilare il programma cosi' come e' ed
eseguirlo. Dopo aver individuato l' errore, correggerlo e vedere quale
e' l'output corretto. Cosa e' cambiato rispetto a prima ?
#include <stdio.h>
int main()
{
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;
}
- Cosa succede se prima dell' istruzione return mettiamo la seguente
istruzione e chiediamo il valore dell' indirezione di cp ?
cp=&i;
E se invece utilizzassimo la possibilita' di un cast anche per i
puntatori e scrivessimo
cp=(char *) & i;
Oppure se scrivessimo
ip=(int *) & c;
e chiedessimo il valore di *ip ?
- Il punto n. 8 dell' esercitazione n. 5 non poteva essere
esteso a variabili float. Mediante puntatori si puo' trovare una
soluzione al problema di visualizzare la sequenza di bit di una
variabile float. (Suggerimento: data una variabile float, farvi
puntare un puntatore a int usando un cast).
- Cosa succede se si cerca di ottenere l' indirizzo di una costante
( p.es. &3.14 ) ? E se si assegna un numero intero ad un
puntatore ( es. int *p; p=315; ) ?
- (Attenzione: prima di eseguire
questo esercizio dare il comando di shell (bash) ulimit -v 100000
per mettere dei limiti ragionevoli ed evitare blocchi del sistema).
La function malloc(size) il cui prototipo, contenuto nel file di
headers <stdlib.h> (da mettere quindi tra gli include)
alloca (se possibile) size unita' di memoria di dimensione
pari a un char (quindi size byte sul
nostro sistema). Scrivere un programma che allochi un numero di bytes
letto da standard input e verifichi che l' allocazione sia riuscita (se
il sistema non risce ad allocare memoria, il puntatore risultante
assume il valore NULL). Cercare di determinare per tentativi la
massima memoria allocabile.