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?
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?
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.
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
Quindi
funzione(int *);
equivale a
funzione(int &);
?
E fare un puntatore a una funzione cosa può servire?
Bhe che io sappia...
Le puoi passare il valore in due modi...codice:void funzione (int *ptr) { cout << *a; }
Modo 1
In questo caso le hai passato il puntatore direttamente: quindi il compilatore farà questa operazione prima di eseguire la funzionecodice:int *a = new int; *a = "10"; funzione(a);
*ptr = *a;
Modo 2
In quest'altro caso passi l'indirizzo della variabile, quindi il compilatore faràcodice:int a = 10; funzione(&a);
*ptr = &a;
che in C/C++ è comunque un costrutto corretto e quindi la funzione può essere eseguita correttamente.
[QUOTE]Originariamente inviato da XWolverineX
Bhe che io sappia...
Scusa ma cosa e' a in questo esempio ? Non compare ne' tra i parametri ne' tra le variabili locali ...codice:void funzione (int *ptr) { cout << *a; }
[QUOTE]Originariamente inviato da XWolverineX
Le puoi passare il valore in due modi...
Modo 1
In questo caso le hai passato il puntatore direttamente: quindi il compilatore farà questa operazione prima di eseguire la funzionecodice:int *a = new int; *a = "10"; funzione(a);
*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;
In questo caso verra' fattoOriginariamente inviato da XWolverineX
Modo 2
In quest'altro caso passi l'indirizzo della variabile, quindi il compilatore faràcodice:int a = 10; funzione(&a);
*ptr = &a;
che in C/C++ è comunque un costrutto corretto e quindi la funzione può essere eseguita correttamente.
ptr = &a;
Fai attenzione perche'
*ptr = &a;
e' sbagliato in quanto penso che un indirizzo sia assegnato ad un valore ...
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.Originariamente inviato da FinalFantasy
Quindi
funzione(int *);
equivale a
funzione(int &);
?
E fare un puntatore a una funzione cosa può servire?
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
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 ...codice:void funzione1(int *a) { *a=99; } void funzione2(int &a) { a=99; }
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" ...