PDA

View Full Version : [C] passaggio dei parametri per riferimento


Lelex82
13-05-2008, 02:31
salve ragazzi,
ho la seguente funzione ricorsiva
void INORDER_TREE_WALK_DEL (treenode_ptr *root,treenode_ptr node,struct timeval curr_time,struct CTRL_header ctrl_head,char* buffer,int buffer_length,Active_func_list_Ptr active_list_ptr, int actived_mtrcs,char* packet,int coll_sock_descrp,int sent_exps,char **argv)
dovrei passare per riferimento i valori di buffer, buffer_length e packet.
devo aggiungere un * davanti a quei parametri e poi nella funzione di richiamo aggiungere una &?

INORDER_TREE_WALK_DEL (&(*root),node->left,curr_time,ctrl_head, buffer, buffer_length, active_list_ptr,actived_mtrcs, packet, coll_sock_descrp,sent_exps,argv);

banryu79
13-05-2008, 09:57
Scusa, ma allora il linguaggio di riferimento è C++, non C giusto?
Perchè mi pare che in C i riferimenti non esistano, ci sono solo i puntatori...

Comunque, detta in modo spiccio (copia&incolla da link su web):

Il passaggio dei parametri per reference

Gli operatori * e & sono in qualche caso utilizzabili in alternativa. Per passare dei valori modificabili ad una funzione è infatti possibile utilizzare le due sintassi equivalenti:

void funzione(int *parametro);
void funzione(int &parametro);

Nel primo caso viene passato il classico puntatore, mentre nel secondo il valore viene passato per riferimento, quindi è trattato come una normale variabile ma le modifiche influenzeranno il valore anche al di fuori della funzione. Il vantaggio nel secondo caso è dato dal fatto che nella chiamata non c'è differenza con un normale passaggio per valore, tuttavia il passaggio per riferimento nasconde al chiamante il fatto che si stia in effetti passando un indirizzo, e non una copia.

Il passaggio per reference costante permette però di evitare la copia temporanea della variabile, ottimizzando le prestazioni:

void funzione(const int &parametro);

Lelex82
13-05-2008, 13:08
supponendo che volessi passare per riferimento solo buffer_length, che è un intero,
scrivere in questo modo è corretto?

{
//nel mai richiamo la funzione
INORDER_TREE_WALK_DEL (..., &buffer_length,...);
}

//funzione implementata
{...
void INORDER_TREE_WALK_DEL (...,int* buffer_length,...)
codice

INORDER_TREE_WALK_DEL (..., &(*buffer_length),...);

codice

INORDER_TREE_WALK_DEL (..., &(*buffer_length),...);
}

Ps i valori passati sembrano essere corretti,ma nn so se sintatticamente è corretto