En C, tout paramètre est passé par valeur, et cette règle ne souffre aucune exception. Cela pose le problème de réaliser un passage de paramètre par adresse lorsque le programmeur en a besoin. La solution à ce problème consiste dans ce cas, à déclarer le paramètre comme étant un pointeur. Cette solution n'est rendue possible que par l'existence de l'opérateur adresse de qui permet de délivrer l'adresse d'une lvalue.
Voyons sur un exemple. Supposons que nous désirions écrire une procédure add, admettant trois paramètres a, b et c. Nous désirons que le résultat de l'exécution de add soit d'affecter au paramètre c la somme des valeurs des deux premiers paramètres. Le paramètre c ne peut évidemment pas être passé par valeur, puisqu'on désire modifier la valeur du paramètre effectif correspondant. Il faut donc programmer add de la manière suivante :
void add(int a, int b, int *c) /* c repère l'entier où on veut mettre le résultat */ { *c = a + b; } int main(void) { int i,j,k; /* on passe les valeurs de i et j comme premiers paramètres */ /* on passe l'adresse de k comme troisième paramètre */ add(i,j,&k); }