SlideShare a Scribd company logo
1 of 34
Download to read offline
Passaggio per valore
●   Al momento del richiamo della funzione il valore
    dei parametri attuali sono ricopiati nello spazio
    di memoria allocato ai parametri formali
Passaggio per valore

main(){
   int x, y;

    x=5;
    y=f(x);
    printf(“%d %d”,x,y);
}

int f(int a){
   int b;
   a=a+1;
   b=a*a;
   return b;
}
Passaggio per valore

main(){                        main
   int x, y;               x          y
                           5          ?
    x=5;
    y=f(x);
    printf(“%d %d”,x,y);
}

int f(int a){
   int b;
   a=a+1;
   b=a*a;
   return b;
}
Passaggio per valore

main(){                        main            f
   int x, y;               x          y   rv       a
                           5          ?    ?
    x=5;                                           5
    y=f(x);
    printf(“%d %d”,x,y);
}

int f(int a){
   int b;
   a=a+1;
   b=a*a;
   return b;
}
Passaggio per valore

main(){                        main            f
   int x, y;               x          y   rv   a   b
                           5          ?    ?
    x=5;                                       5
    y=f(x);                                        ?
    printf(“%d %d”,x,y);
}

int f(int a){
   int b;
   a=a+1;
   b=a*a;
   return b;
}
Passaggio per valore

main(){                        main            f
   int x, y;               x          y   rv   a   b
                           5          ?    ?
    x=5;                                       5
    y=f(x);
                                                   ?
    printf(“%d %d”,x,y);
                                               6
}

int f(int a){
   int b;
   a=a+1;
   b=a*a;
   return b;
}
Passaggio per valore

main(){                            main             f
   int x, y;                   x          y   rv    a      b
                               5          ?    ?
    x=5;                                            5
    y=f(x);
                                                           ?
    printf(“%d %d”,x,y);
                                                    6
}

int f(int a){
   int b;
   a=a+1;
   b=a*a;
   return b;                  Passaggio per valore:
}                          le modifiche effettuate nella
                           funzione restano confinate
                              nell'ambiente locale
Passaggio per valore

main(){                        main            f
   int x, y;               x          y   rv   a   b
                           5          ?    ?
    x=5;                                       5
    y=f(x);
                                                   ?
    printf(“%d %d”,x,y);
                                               6
}
                                                   36
int f(int a){
   int b;
   a=a+1;
   b=a*a;
   return b;
}
Passaggio per valore

main(){                        main            f
   int x, y;               x          y   rv   a   b
                           5          ?    ?
    x=5;                                       5
    y=f(x);
                                                   ?
    printf(“%d %d”,x,y);
                                               6
}
                                                   36
int f(int a){                             36
   int b;
   a=a+1;
   b=a*a;
   return b;
}
Passaggio per valore

main(){                          main
   int x, y;                 x          y
                             5          ?
    x=5;
    y=f(x);
    printf(“%d %d”,x,y);
}

int f(int a){
   int b;                           36
   a=a+1;
   b=a*a;
   return b;                Al termine della funzione
}                          l'ambiente locale viene
                                   eliminato
Passaggio per valore

main(){                         main
   int x, y;                x          y
                            5          ?
    x=5;
    y=f(x);
    printf(“%d %d”,x,y);
}

int f(int a){
   int b;                          36
   a=a+1;
   b=a*a;                  standard output
   return b;               5 36
}
Valori di ritorno
p1
     ...   f   rType f(type1 p1, type2 p2 ... typeN pN)
pN



p1             void f(type1 p1, type2 p2 ... typeN pN)
     ...   f
pN


                    rType f(void)
           f
                    rType f()


                    void f(void)
           f                                 main
                    f()
Valori di ritorno


pIn1                       pOut1
       ...    f      ...
pInN                       pOutM




             ?
Valori di ritorno e passaggio per
                   indirizzo
●   nell'istruzione return può essere specificato una
    espressione di tipo atomico (int, float, char ecc)
●   se la funzione deve restituire più di un risultato
    non si può utilizzare il return
●   la tecnica utilizzata è quella del passaggio dei
    parametri per riferimento (indirizzo)
●   più in generale il passaggio per riferimento
    consente alla funzione di modificare i parametri
    attuali
Puntatori
●   Se la funzione conoscesse la posizione
    (indirizzo) in memoria dei parametri attuali
    potrebbe accedervi per modificarli
●   La tecnica è implementata in C mediante
    l'utilizzo del puntatore
●   Un puntatore è un indirizzo di memoria
●   Una variabile di tipo puntatore può contenere
    l'indirizzo di memoria di un'altra variabile
Puntatori

...                  Variabile intera



int x;

int *px;
              Variabile puntatore a intero

...                    (asterisco)
Puntatori

...
int x;              Indirizzo    Contenuto       variabile
int *px;           ...          ...
...                0x00000100   ?                    x
                   0x00000104   ?                   px
px = &x;           0x00000108
*px = 5;           0x0000010C
...                0x00000110



                                ...


           Supponiamo che sia un intero che un
               puntatore occupino 4 byte
Puntatori

...
int x;              Indirizzo    Contenuto   variabile
int *px;           ...          ...
...                0x00000100   ?                x
                   0x00000104   0x00000100      px
px = &x;           0x00000108
*px = 5;           0x0000010C
...                0x00000110



                                ...



       & : operatore di estrazione di indirizzo
Puntatori

...
int x;                Indirizzo    Contenuto   variabile
int *px;             ...          ...
...                  0x00000100   0x00000005       x
                     0x00000104   0x00000100      px
px = &x;             0x00000108
*px = 5;             0x0000010C
...                  0x00000110



                                  ...


     * : operatore di dereferenziazione di un
           indirizzo (estrazione del contenuto)
Proprietà fondamentale



    *&x = x
Passaggio per indirizzo
●   Se alla funzione A forniamo l'indirizzo di una
    variabile della funzione chiamante B, la funzione
    A può modificare il valore della variabile di B


                  void A(int *x){
                    *x = *x + 1;
                  }
Passaggio per indirizzo

main(){
   int x;

    x=5;
    f(&x);
    printf(“%d”,x);
}

void f(int *a){

    *a = *a + 1;

}
Passaggio per indirizzo

main(){               main
   int x;               x
                        5
    x=5;
    f(&x);
    printf(“%d”,x);
}

void f(int *a){

    *a = *a + 1;

}
Passaggio per indirizzo

main(){               main    f
   int x;               x    *a
                        5
    x=5;
    f(&x);
    printf(“%d”,x);
}

void f(int *a){

    *a = *a + 1;

}
Passaggio per indirizzo

main(){               main    f
   int x;               x    *a
                        5
    x=5;                6
    f(&x);
    printf(“%d”,x);
}

void f(int *a){

    *a = *a + 1;

}
Passaggio per indirizzo

main(){               main
   int x;               x
                        5
    x=5;                6
    f(&x);
    printf(“%d”,x);
}

void f(int *a){

    *a = *a + 1;

}
Passaggio per indirizzo

main(){               main
   int x;              x
                       5
    x=5;               6
    f(&x);
    printf(“%d”,x);
}

void f(int *a){

    *a = *a + 1;
                      standard output
}                     6
scanf

main(){               main       scanf
   int x;               x        *...

  scanf(“%d”,&x);
  ....




      Nella scanf si usa il simbolo & perchè le
   variabili da leggere sono passate per indirizzo
scanf

main(){                  main       lettura     scanf
   int x;                  x          *z         *...

    lettura(&x, ...);
    ...
}

void lettura(int *z, ...){

    ...                             Nella scanf non è
    scanf(“%d”,z);              necessario l'operatore &
    ...                           in quanto z è già un
}                                        indirizzo
Scambio del valore di due variabili
        a                b

        5                10
Scambio del valore di due variabili
             a             b

             5             10



                 1
                     aux

                     5

  ...
  aux = a;
  a = b;
  b = aux;
  ...
Scambio del valore di due variabili
             a             b
                     2
         10                10



                 1
                     aux

                     5

  ...
  aux = a;
  a = b;
  b = aux;
  ...
Scambio del valore di due variabili
             a                 b
                     2
         10                    5



                 1         3
                     aux

                     5

  ...
  aux = a;
  a = b;
  b = aux;
  ...
Scambio del valore di due variabili

  void scambia(int *a, int* b){
    int aux;

      aux = *a;
      *a = *b;
      *b = aux;

  }

More Related Content

What's hot

05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioni05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioniPiero Fraternali
 
12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatoriMajong DevJfu
 
Eserc v del 26 marzo 2012
 Eserc v del 26 marzo 2012 Eserc v del 26 marzo 2012
Eserc v del 26 marzo 2012STELITANO
 
08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimenti08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimentiMajong DevJfu
 
Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)STELITANO
 
Algoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, codeAlgoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, codeSergio Porcu
 
10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturatiMajong DevJfu
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
13 Puntatori E Memoria Dinamica
13   Puntatori E Memoria Dinamica13   Puntatori E Memoria Dinamica
13 Puntatori E Memoria Dinamicaguest60e9511
 
06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedefPiero Fraternali
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)STELITANO
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2Majong DevJfu
 
Functional Programming per tutti
Functional Programming per tuttiFunctional Programming per tutti
Functional Programming per tuttiGiancarlo Valente
 

What's hot (20)

05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioni05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioni
 
Ese01 java
Ese01 javaEse01 java
Ese01 java
 
12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori
 
Eserc v del 26 marzo 2012
 Eserc v del 26 marzo 2012 Eserc v del 26 marzo 2012
Eserc v del 26 marzo 2012
 
Pillole di C++
Pillole di C++Pillole di C++
Pillole di C++
 
Tutorial Matlab 2009
Tutorial Matlab 2009Tutorial Matlab 2009
Tutorial Matlab 2009
 
Corso c++
Corso c++Corso c++
Corso c++
 
08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimenti08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimenti
 
Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)
 
Algoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, codeAlgoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, code
 
06 2 vector_matrici
06 2 vector_matrici06 2 vector_matrici
06 2 vector_matrici
 
10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
13 Puntatori E Memoria Dinamica
13   Puntatori E Memoria Dinamica13   Puntatori E Memoria Dinamica
13 Puntatori E Memoria Dinamica
 
06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedef
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2
 
Functional Programming per tutti
Functional Programming per tuttiFunctional Programming per tutti
Functional Programming per tutti
 
Metodo di Newton
Metodo di NewtonMetodo di Newton
Metodo di Newton
 

Viewers also liked

DSA - delivering on the promise of bespoke support
DSA  - delivering on the promise of bespoke support DSA  - delivering on the promise of bespoke support
DSA - delivering on the promise of bespoke support iansyst
 
φωτοσύνθεση εβελίνα και χρυσούλα
φωτοσύνθεση εβελίνα και χρυσούλαφωτοσύνθεση εβελίνα και χρυσούλα
φωτοσύνθεση εβελίνα και χρυσούλα3dimchan
 
Analisis bauran pemasaran yang dipertimbangkan dalam keputusan pembelian
Analisis bauran pemasaran yang dipertimbangkan dalam keputusan pembelianAnalisis bauran pemasaran yang dipertimbangkan dalam keputusan pembelian
Analisis bauran pemasaran yang dipertimbangkan dalam keputusan pembelianTri Y. Evelina
 
Excel- AUTORELLENADO
Excel- AUTORELLENADOExcel- AUTORELLENADO
Excel- AUTORELLENADOdtbgiss
 
Il metodo dei minimi quadrati
Il metodo dei minimi quadratiIl metodo dei minimi quadrati
Il metodo dei minimi quadratilalybazzan
 
Системы электронных платежей в России (исследование TNS)
Системы электронных платежей в России (исследование TNS)Системы электронных платежей в России (исследование TNS)
Системы электронных платежей в России (исследование TNS)Яндекс.Деньги
 
Kalkulus 2 minggu 11
Kalkulus 2   minggu 11Kalkulus 2   minggu 11
Kalkulus 2 minggu 11Iwan Pranoto
 
HOW TO SURVIVE A HEART ATTACK WHEN ALONE ?
HOW TO SURVIVE A HEART ATTACK WHEN ALONE ?HOW TO SURVIVE A HEART ATTACK WHEN ALONE ?
HOW TO SURVIVE A HEART ATTACK WHEN ALONE ?Amit Jhunjhunwala
 
Reproducables spanish CREATE Toghether
Reproducables spanish CREATE ToghetherReproducables spanish CREATE Toghether
Reproducables spanish CREATE Toghetherestre64
 
5434 avtodsdsdsds
5434 avtodsdsdsds5434 avtodsdsdsds
5434 avtodsdsdsdsNightLightW
 
Diapositiva blog cbtis88
Diapositiva blog cbtis88Diapositiva blog cbtis88
Diapositiva blog cbtis88darkingpro
 
Making Telecoms the Essential Spice of Every Business Ecosystem: The Slow, Pa...
Making Telecoms the Essential Spice of Every Business Ecosystem: The Slow, Pa...Making Telecoms the Essential Spice of Every Business Ecosystem: The Slow, Pa...
Making Telecoms the Essential Spice of Every Business Ecosystem: The Slow, Pa...Alan Quayle
 
Haluttu tyonantaja - The How's and Wow's
Haluttu tyonantaja - The How's and Wow'sHaluttu tyonantaja - The How's and Wow's
Haluttu tyonantaja - The How's and Wow'sSusanna Rantanen
 
Czech easter traditions
Czech easter traditionsCzech easter traditions
Czech easter traditionsLenka Jacko
 

Viewers also liked (18)

Kalender actie
Kalender actieKalender actie
Kalender actie
 
DSA - delivering on the promise of bespoke support
DSA  - delivering on the promise of bespoke support DSA  - delivering on the promise of bespoke support
DSA - delivering on the promise of bespoke support
 
φωτοσύνθεση εβελίνα και χρυσούλα
φωτοσύνθεση εβελίνα και χρυσούλαφωτοσύνθεση εβελίνα και χρυσούλα
φωτοσύνθεση εβελίνα και χρυσούλα
 
Analisis bauran pemasaran yang dipertimbangkan dalam keputusan pembelian
Analisis bauran pemasaran yang dipertimbangkan dalam keputusan pembelianAnalisis bauran pemasaran yang dipertimbangkan dalam keputusan pembelian
Analisis bauran pemasaran yang dipertimbangkan dalam keputusan pembelian
 
Excel- AUTORELLENADO
Excel- AUTORELLENADOExcel- AUTORELLENADO
Excel- AUTORELLENADO
 
Tolima ibague onzaga
Tolima ibague onzagaTolima ibague onzaga
Tolima ibague onzaga
 
Il metodo dei minimi quadrati
Il metodo dei minimi quadratiIl metodo dei minimi quadrati
Il metodo dei minimi quadrati
 
Системы электронных платежей в России (исследование TNS)
Системы электронных платежей в России (исследование TNS)Системы электронных платежей в России (исследование TNS)
Системы электронных платежей в России (исследование TNS)
 
Kalkulus 2 minggu 11
Kalkulus 2   minggu 11Kalkulus 2   minggu 11
Kalkulus 2 minggu 11
 
HOW TO SURVIVE A HEART ATTACK WHEN ALONE ?
HOW TO SURVIVE A HEART ATTACK WHEN ALONE ?HOW TO SURVIVE A HEART ATTACK WHEN ALONE ?
HOW TO SURVIVE A HEART ATTACK WHEN ALONE ?
 
Reproducables spanish CREATE Toghether
Reproducables spanish CREATE ToghetherReproducables spanish CREATE Toghether
Reproducables spanish CREATE Toghether
 
5434 avtodsdsdsds
5434 avtodsdsdsds5434 avtodsdsdsds
5434 avtodsdsdsds
 
Diapositiva blog cbtis88
Diapositiva blog cbtis88Diapositiva blog cbtis88
Diapositiva blog cbtis88
 
Making Telecoms the Essential Spice of Every Business Ecosystem: The Slow, Pa...
Making Telecoms the Essential Spice of Every Business Ecosystem: The Slow, Pa...Making Telecoms the Essential Spice of Every Business Ecosystem: The Slow, Pa...
Making Telecoms the Essential Spice of Every Business Ecosystem: The Slow, Pa...
 
Haluttu tyonantaja - The How's and Wow's
Haluttu tyonantaja - The How's and Wow'sHaluttu tyonantaja - The How's and Wow's
Haluttu tyonantaja - The How's and Wow's
 
Menjar
MenjarMenjar
Menjar
 
Czech easter traditions
Czech easter traditionsCzech easter traditions
Czech easter traditions
 
Derechocomparado
DerechocomparadoDerechocomparado
Derechocomparado
 

More from STELITANO

Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012STELITANO
 
Soluzione esame a del 13 giugno 2012
Soluzione esame a del 13 giugno 2012Soluzione esame a del 13 giugno 2012
Soluzione esame a del 13 giugno 2012STELITANO
 
Soluzioni abilità informatiche 16 maggio 2012
Soluzioni abilità informatiche 16 maggio 2012Soluzioni abilità informatiche 16 maggio 2012
Soluzioni abilità informatiche 16 maggio 2012STELITANO
 
Dispenza aloisi
Dispenza aloisiDispenza aloisi
Dispenza aloisiSTELITANO
 
Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)STELITANO
 
Lezione 22 (7 maggio 2012)
Lezione 22 (7 maggio 2012)Lezione 22 (7 maggio 2012)
Lezione 22 (7 maggio 2012)STELITANO
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)STELITANO
 
Lezione 20 (2 maggio 2012) seconda parte
Lezione 20 (2 maggio 2012) seconda parteLezione 20 (2 maggio 2012) seconda parte
Lezione 20 (2 maggio 2012) seconda parteSTELITANO
 
Lezione 20 (2 maggio 2012) prima parte
Lezione 20 (2 maggio 2012) prima parteLezione 20 (2 maggio 2012) prima parte
Lezione 20 (2 maggio 2012) prima parteSTELITANO
 
Lezione 19 (18 aprile 2012) ricerca
Lezione 19 (18 aprile 2012)   ricercaLezione 19 (18 aprile 2012)   ricerca
Lezione 19 (18 aprile 2012) ricercaSTELITANO
 
Lezione 18 (18 aprile 2012) ordinamenti
Lezione 18 (18 aprile 2012)   ordinamentiLezione 18 (18 aprile 2012)   ordinamenti
Lezione 18 (18 aprile 2012) ordinamentiSTELITANO
 
Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)STELITANO
 
Lezione 14 (2 aprile 2012)
Lezione 14 (2 aprile 2012)Lezione 14 (2 aprile 2012)
Lezione 14 (2 aprile 2012)STELITANO
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)STELITANO
 
Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)STELITANO
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)STELITANO
 
Lezione 12 (28 marzo 2012) puntatori vettori
Lezione 12 (28 marzo 2012) puntatori   vettoriLezione 12 (28 marzo 2012) puntatori   vettori
Lezione 12 (28 marzo 2012) puntatori vettoriSTELITANO
 
Soluzione esonero del 4 aprile 2012
Soluzione esonero del 4 aprile 2012Soluzione esonero del 4 aprile 2012
Soluzione esonero del 4 aprile 2012STELITANO
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)STELITANO
 

More from STELITANO (20)

Risultati
RisultatiRisultati
Risultati
 
Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012
 
Soluzione esame a del 13 giugno 2012
Soluzione esame a del 13 giugno 2012Soluzione esame a del 13 giugno 2012
Soluzione esame a del 13 giugno 2012
 
Soluzioni abilità informatiche 16 maggio 2012
Soluzioni abilità informatiche 16 maggio 2012Soluzioni abilità informatiche 16 maggio 2012
Soluzioni abilità informatiche 16 maggio 2012
 
Dispenza aloisi
Dispenza aloisiDispenza aloisi
Dispenza aloisi
 
Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)
 
Lezione 22 (7 maggio 2012)
Lezione 22 (7 maggio 2012)Lezione 22 (7 maggio 2012)
Lezione 22 (7 maggio 2012)
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)
 
Lezione 20 (2 maggio 2012) seconda parte
Lezione 20 (2 maggio 2012) seconda parteLezione 20 (2 maggio 2012) seconda parte
Lezione 20 (2 maggio 2012) seconda parte
 
Lezione 20 (2 maggio 2012) prima parte
Lezione 20 (2 maggio 2012) prima parteLezione 20 (2 maggio 2012) prima parte
Lezione 20 (2 maggio 2012) prima parte
 
Lezione 19 (18 aprile 2012) ricerca
Lezione 19 (18 aprile 2012)   ricercaLezione 19 (18 aprile 2012)   ricerca
Lezione 19 (18 aprile 2012) ricerca
 
Lezione 18 (18 aprile 2012) ordinamenti
Lezione 18 (18 aprile 2012)   ordinamentiLezione 18 (18 aprile 2012)   ordinamenti
Lezione 18 (18 aprile 2012) ordinamenti
 
Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)
 
Lezione 14 (2 aprile 2012)
Lezione 14 (2 aprile 2012)Lezione 14 (2 aprile 2012)
Lezione 14 (2 aprile 2012)
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)
 
Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)
 
Lezione 12 (28 marzo 2012) puntatori vettori
Lezione 12 (28 marzo 2012) puntatori   vettoriLezione 12 (28 marzo 2012) puntatori   vettori
Lezione 12 (28 marzo 2012) puntatori vettori
 
Soluzione esonero del 4 aprile 2012
Soluzione esonero del 4 aprile 2012Soluzione esonero del 4 aprile 2012
Soluzione esonero del 4 aprile 2012
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
 

Lezione 12 (28 marzo 2012) funzioni memoria - puntatori

  • 1. Passaggio per valore ● Al momento del richiamo della funzione il valore dei parametri attuali sono ricopiati nello spazio di memoria allocato ai parametri formali
  • 2. Passaggio per valore main(){ int x, y; x=5; y=f(x); printf(“%d %d”,x,y); } int f(int a){ int b; a=a+1; b=a*a; return b; }
  • 3. Passaggio per valore main(){ main int x, y; x y 5 ? x=5; y=f(x); printf(“%d %d”,x,y); } int f(int a){ int b; a=a+1; b=a*a; return b; }
  • 4. Passaggio per valore main(){ main f int x, y; x y rv a 5 ? ? x=5; 5 y=f(x); printf(“%d %d”,x,y); } int f(int a){ int b; a=a+1; b=a*a; return b; }
  • 5. Passaggio per valore main(){ main f int x, y; x y rv a b 5 ? ? x=5; 5 y=f(x); ? printf(“%d %d”,x,y); } int f(int a){ int b; a=a+1; b=a*a; return b; }
  • 6. Passaggio per valore main(){ main f int x, y; x y rv a b 5 ? ? x=5; 5 y=f(x); ? printf(“%d %d”,x,y); 6 } int f(int a){ int b; a=a+1; b=a*a; return b; }
  • 7. Passaggio per valore main(){ main f int x, y; x y rv a b 5 ? ? x=5; 5 y=f(x); ? printf(“%d %d”,x,y); 6 } int f(int a){ int b; a=a+1; b=a*a; return b; Passaggio per valore: } le modifiche effettuate nella funzione restano confinate nell'ambiente locale
  • 8. Passaggio per valore main(){ main f int x, y; x y rv a b 5 ? ? x=5; 5 y=f(x); ? printf(“%d %d”,x,y); 6 } 36 int f(int a){ int b; a=a+1; b=a*a; return b; }
  • 9. Passaggio per valore main(){ main f int x, y; x y rv a b 5 ? ? x=5; 5 y=f(x); ? printf(“%d %d”,x,y); 6 } 36 int f(int a){ 36 int b; a=a+1; b=a*a; return b; }
  • 10. Passaggio per valore main(){ main int x, y; x y 5 ? x=5; y=f(x); printf(“%d %d”,x,y); } int f(int a){ int b; 36 a=a+1; b=a*a; return b; Al termine della funzione } l'ambiente locale viene eliminato
  • 11. Passaggio per valore main(){ main int x, y; x y 5 ? x=5; y=f(x); printf(“%d %d”,x,y); } int f(int a){ int b; 36 a=a+1; b=a*a; standard output return b; 5 36 }
  • 12. Valori di ritorno p1 ... f rType f(type1 p1, type2 p2 ... typeN pN) pN p1 void f(type1 p1, type2 p2 ... typeN pN) ... f pN rType f(void) f rType f() void f(void) f main f()
  • 13. Valori di ritorno pIn1 pOut1 ... f ... pInN pOutM ?
  • 14. Valori di ritorno e passaggio per indirizzo ● nell'istruzione return può essere specificato una espressione di tipo atomico (int, float, char ecc) ● se la funzione deve restituire più di un risultato non si può utilizzare il return ● la tecnica utilizzata è quella del passaggio dei parametri per riferimento (indirizzo) ● più in generale il passaggio per riferimento consente alla funzione di modificare i parametri attuali
  • 15. Puntatori ● Se la funzione conoscesse la posizione (indirizzo) in memoria dei parametri attuali potrebbe accedervi per modificarli ● La tecnica è implementata in C mediante l'utilizzo del puntatore ● Un puntatore è un indirizzo di memoria ● Una variabile di tipo puntatore può contenere l'indirizzo di memoria di un'altra variabile
  • 16. Puntatori ... Variabile intera int x; int *px; Variabile puntatore a intero ... (asterisco)
  • 17. Puntatori ... int x; Indirizzo Contenuto variabile int *px; ... ... ... 0x00000100 ? x 0x00000104 ? px px = &x; 0x00000108 *px = 5; 0x0000010C ... 0x00000110 ... Supponiamo che sia un intero che un puntatore occupino 4 byte
  • 18. Puntatori ... int x; Indirizzo Contenuto variabile int *px; ... ... ... 0x00000100 ? x 0x00000104 0x00000100 px px = &x; 0x00000108 *px = 5; 0x0000010C ... 0x00000110 ... & : operatore di estrazione di indirizzo
  • 19. Puntatori ... int x; Indirizzo Contenuto variabile int *px; ... ... ... 0x00000100 0x00000005 x 0x00000104 0x00000100 px px = &x; 0x00000108 *px = 5; 0x0000010C ... 0x00000110 ... * : operatore di dereferenziazione di un indirizzo (estrazione del contenuto)
  • 21. Passaggio per indirizzo ● Se alla funzione A forniamo l'indirizzo di una variabile della funzione chiamante B, la funzione A può modificare il valore della variabile di B void A(int *x){ *x = *x + 1; }
  • 22. Passaggio per indirizzo main(){ int x; x=5; f(&x); printf(“%d”,x); } void f(int *a){ *a = *a + 1; }
  • 23. Passaggio per indirizzo main(){ main int x; x 5 x=5; f(&x); printf(“%d”,x); } void f(int *a){ *a = *a + 1; }
  • 24. Passaggio per indirizzo main(){ main f int x; x *a 5 x=5; f(&x); printf(“%d”,x); } void f(int *a){ *a = *a + 1; }
  • 25. Passaggio per indirizzo main(){ main f int x; x *a 5 x=5; 6 f(&x); printf(“%d”,x); } void f(int *a){ *a = *a + 1; }
  • 26. Passaggio per indirizzo main(){ main int x; x 5 x=5; 6 f(&x); printf(“%d”,x); } void f(int *a){ *a = *a + 1; }
  • 27. Passaggio per indirizzo main(){ main int x; x 5 x=5; 6 f(&x); printf(“%d”,x); } void f(int *a){ *a = *a + 1; standard output } 6
  • 28. scanf main(){ main scanf int x; x *... scanf(“%d”,&x); .... Nella scanf si usa il simbolo & perchè le variabili da leggere sono passate per indirizzo
  • 29. scanf main(){ main lettura scanf int x; x *z *... lettura(&x, ...); ... } void lettura(int *z, ...){ ... Nella scanf non è scanf(“%d”,z); necessario l'operatore & ... in quanto z è già un } indirizzo
  • 30. Scambio del valore di due variabili a b 5 10
  • 31. Scambio del valore di due variabili a b 5 10 1 aux 5 ... aux = a; a = b; b = aux; ...
  • 32. Scambio del valore di due variabili a b 2 10 10 1 aux 5 ... aux = a; a = b; b = aux; ...
  • 33. Scambio del valore di due variabili a b 2 10 5 1 3 aux 5 ... aux = a; a = b; b = aux; ...
  • 34. Scambio del valore di due variabili void scambia(int *a, int* b){ int aux; aux = *a; *a = *b; *b = aux; }