PDA

Visualizza la versione completa : [C++] puntatori e funzioni


FinalFantasy
18-11-2005, 19:25
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?

oregon
18-11-2005, 20:18
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.

XWolverineX
18-11-2005, 20:30
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

FinalFantasy
18-11-2005, 22:35
Quindi

funzione(int *);

equivale a

funzione(int &);

?

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

XWolverineX
18-11-2005, 22:41
Bhe che io sappia...

void funzione (int *ptr) { cout << *a; }

Le puoi passare il valore in due modi...

Modo 1



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



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.

oregon
19-11-2005, 00:30
Originariamente inviato da XWolverineX
Bhe che io sappia...

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



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;


[QUOTE]Originariamente inviato da XWolverineX
Modo 2



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

oregon
19-11-2005, 00:42
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



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

Loading