Laboratorio di Informatica I: Programmazione. AA 2003/04.
Esercitazione n. 6

Scopo di questa esercitazione è di familiarizzarsi con i puntatori e functions.

Al solito, si suggerisce di creare una directory apposita per i files relativi a questa esercitazione.


     
  1. 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 ).

  2. 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 );
    ...
     

  3. 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.

  4. 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;
    }


  5. 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.

  6. 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;
    }
  7. 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 ?

  8. 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).

  9. 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; ) ?

  10. (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.