Esistono diverse modalità di passaggio dei parametri, o di accesso alle strutture definite all'interno del programma stesso: ogni linguaggio, infatti, gestisce il proprio [[ambiente (programmazione)|ambiente]] dipendentemente dalle [[Variabile (informatica)#Visibilità di una variabile|regole di scoping]] che implementa, e di cui è necessario tenere conto.
==== Variabili globali ====
Il metodo più semplice di passare parametri a una funzione è l'utilizzo di [[variabile (informatica)|variabili]] globali, ovvero visibili da qualsiasi parte del programma. Questa pratica, quando attuata indiscriminatamente, è fortemente scoraggiata, perché può portare a una scarsa leggibilità semantica del codice, con conseguenze spesso inaspettate. Pertanto l'uso di variabili globali viene considerata una forma impropria di passaggio di parametri.
==== Passaggio per valore ====
Con questo meccanismo (nella letteratura in inglese indicato come "''pass by value''") il valore del parametro effettivo viene copiato nella variabile della funzione chiamata che rappresenta il parametro formale. Se la funzione chiamata lo modifica, la funzione chiamante non potrà vedere questa modifica. Si tratta quindi di un passaggio unidirezionale.
==== Passaggio per indirizzo o per riferimento ====
Con questo meccanismo (nella letteratura in inglese indicato come "''pass by reference''") la funzione invocata riceve come parametro un [[puntatore (programmazione)|puntatore]] o riferimento al parametro effettivo. Se modifica il parametro passato per indirizzo, la modifica sarà visibile anche alla funzione chiamante. Il passaggio è quindi potenzialmente bidirezionale. ▼
==== Passaggio per risultato ====
Questo meccanismo (nella letteratura in inglese indicato come "''pass by result''") è unidirezionale, serve cioè a passare un risultato al chiamante. Come nel caso del "passaggio per indirizzo", la funzione invocata riceve un [[puntatore (programmazione)|puntatore]] o riferimento al parametro effettivo. Questo puntatore viene però usato non per leggere il valore del parametro, ma per copiarvi il risultato calcolato dalla funzione.
==== Passaggio per valore e risultato ====
Questo meccanismo (nella letteratura in inglese indicato come "''pass by value-returned''" o "''pass by value-result''") è una combinazione dei meccanismi di "passaggio per valore" e "passaggio per indirizzo". Il parametro è passato per indirizzo, cioè la funzione chiamata riceve un puntatore o riferimento al parametro effettivo. Tuttavia, in questo caso, la funzione fa una copia interna del parametro effettivo e usa questa copia. Prima di terminare, usa l'indirizzo del parametro effettivo per copiare il contenuto della sua copia interna sul parametro effettivo (in pratica per restituire il valore al chiamante).
==== Passaggio per nome ====
Questo meccanismo (nella letteratura in inglese indicato come "''pass by name''"), di difficile realizzazione nei linguaggi compilati, è soprattutto usato nelle [[Macro (informatica)|macro]]. Il passaggio per nome è tuttavia stato usato nell'[[ALGOL|ALGOL 68]] e nel [[Simula]]. A differenza degli altri tipi di passaggio di parametro, in cui viene creato il legame tra il parametro effettivo ed il parametro formale, in questo caso si crea un legame tra il parametro formale e una chiusura, formata dal parametro effettivo insieme al proprio ambiente di valutazione, che è fissato al momento della chiamata. Inoltre bisogna fare attenzione che con questo tipo di passaggio di parametro, il parametro effettivo viene valutato ogni volta che il parametro formale viene incontrato durante l'esecuzione.
==== Passaggio per condivisioneriferimento ====
▲Con questo meccanismo (nella letteratura in inglese indicato come "''pass by reference''") la funzione invocata riceve come parametro un [[puntatore (programmazione)|puntatore]] o riferimento al parametro effettivo. Se modifica il parametro passato per indirizzo, la modifica sarà visibile anche alla funzione chiamante. Il passaggio è quindi potenzialmente bidirezionale.
Con questo meccanismo (nella letteratura in inglese indicato come "''pass by sharing''"), adottato ad esempio dal [[Python]], chiamante e chiamato condividono il parametro effettivo.
=== Valore restituito ===
|