Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657

    [C++] puntatori e funzioni

    Ho due quesiti che vedono i puntatori da un lato e le funzioni dall'altro: passare un puntatore come parametro equivale a pasasrlo per indirizzo? Quali sn le differenze?

    A cosa può servire fare un puntatore a una funzione? i vantaggi quali sono?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Passare un puntatore ad una variabile ad una funzione, equivale a passare la variabile per indirizzo.

    Se non passi il puntatore, la variabile non puo' essere modificata dalla funzione.

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Passare puntatori alle si rileva un metodo per risparmiare memoria.
    Se non si passa come puntatore, ogni volta il compilatore deve creare una copia del valore passato, occupanto della memoria. passandone invece il puntatore si passa il valore per riferimento, non sprecando la memoria.
    Certi dicono che è pericoloso passare per riferimento, perchè passando per valore non c'è il rischio di modificare il parametro inviato, mentre per riferimento se modifichi il valore, viene modificato in tutto e per tutto.
    Secondo me è sbagliato perchè basta aggiungere il qualificatore const al valore passato per riferimento per avere i vantaggi limitando i difetti

  4. #4
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657
    Quindi

    funzione(int *);

    equivale a

    funzione(int &);

    ?

    E fare un puntatore a una funzione cosa può servire?

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Bhe che io sappia...
    codice:
    void funzione (int *ptr) { cout << *a; }
    Le puoi passare il valore in due modi...

    Modo 1

    codice:
    int *a = new int;
    *a = "10";
    funzione(a);
    In questo caso le hai passato il puntatore direttamente: quindi il compilatore farà questa operazione prima di eseguire la funzione

    *ptr = *a;

    Modo 2

    codice:
    int a = 10;
    funzione(&a);
    In quest'altro caso passi l'indirizzo della variabile, quindi il compilatore farà

    *ptr = &a;

    che in C/C++ è comunque un costrutto corretto e quindi la funzione può essere eseguita correttamente.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    [QUOTE]Originariamente inviato da XWolverineX
    Bhe che io sappia...
    codice:
    void funzione (int *ptr) { cout << *a; }
    Scusa ma cosa e' a in questo esempio ? Non compare ne' tra i parametri ne' tra le variabili locali ...

    [QUOTE]Originariamente inviato da XWolverineX
    Le puoi passare il valore in due modi...

    Modo 1

    codice:
    int *a = new int;
    *a = "10";
    funzione(a);
    In questo caso le hai passato il puntatore direttamente: quindi il compilatore farà questa operazione prima di eseguire la funzione

    *ptr = *a;
    [/CODE]

    In questo codice, la riga

    *a = "10";

    e' (gravemente) sbagliata dato che a e' un puntatore ad intero e non a stringa.

    In realta', al momento del passaggio il compilatore esegue una semplice

    ptr = a;


    Originariamente inviato da XWolverineX
    Modo 2

    codice:
    int a = 10;
    funzione(&a);
    In quest'altro caso passi l'indirizzo della variabile, quindi il compilatore farà

    *ptr = &a;

    che in C/C++ è comunque un costrutto corretto e quindi la funzione può essere eseguita correttamente.
    In questo caso verra' fatto

    ptr = &a;

    Fai attenzione perche'

    *ptr = &a;

    e' sbagliato in quanto penso che un indirizzo sia assegnato ad un valore ...

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da FinalFantasy
    Quindi

    funzione(int *);

    equivale a

    funzione(int &);

    ?

    E fare un puntatore a una funzione cosa può servire?
    Le due modalita' di passaggio del parametro che hai indicato, per puntatore e per riferimento, sono funzionalmente eguali. Nel senso che in tutti e due i modi il compilatore si aspetta "l'indirizzo" di un dato e non il dato stesso.

    La differenza sta all'interno della funzione. Nel primo caso dovrai usare la classica sintassi dei puntatori nell'accesso al dato, nel secondo puoi usare la sintassi piu' comune ... ovvero

    codice:
    void funzione1(int *a)
    {
       *a=99;
    }
    
    
    void funzione2(int &a)
    {
       a=99;
    }
    Con i puntatori a funzione puoi, ad esempio, realizzare una tabella di puntatori a funzione e chiamare una funzione in base all'indice della tabella. Il codice puo' "scegliere" quale parte funzione chiamare in base ad un valore numerico intero direttamente, senza usare un lungo elenco di if o un enorme switch ... e' una possibilita' molto usata dai compilatori stessi ...

    In piu', e' possibile passare ad una funzione l'indirizzo di un'altra funzione da chiamare durante l'esecuzione della prima. E' la cosiddetta funzione di "callback" ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.