que se passe-t-il lors du passage par référence en C?

Je sais que lorsque nous transmettons un paramètre à la fonction, une copie est créée dans la stack de la fonction et la valeur réelle du paramètre ne change pas dans la fonction de l’appelant.

Que se passe-t-il lorsque vous passez un pointeur sur la fonction? Je sais que la valeur du paramètre est modifiée dans la fonction appelants. Mais comment ça se passe en interne? Comment la fonction appelée accède-t-elle à une variable de la fonction de l’appelant?

J’ai essayé d’obtenir des informations à partir de la page Call_by_reference de wikipeidia, mais je n’étais pas substantiel.

Je suis confus avec cela une fois que j’ai commencé à lire sur les chaînes et à les transmettre en tant que parameters à d’autres fonctions. Toute aide concernant ce serait une grande aide. Merci!!!!

Lorsque vous passez un pointeur sur une fonction, le pointeur est copié. Cependant, une copie d’un pointeur sur un object x est également un pointeur sur x et peut donc être utilisée pour modifier x .

Pour une analogie (artificielle), supposons que x soit votre maison. Selon les règles de C, lorsque vous avez besoin d’un plombier pour réparer quelque chose dans votre maison, vous pouvez en donner une copie à votre plombier, le faire réparer et vous le restituer. Inutile de dire que pour les maisons de plus de quelques octets, c’est assez inefficace à cause de toutes les copies. Au lieu de cela, vous donnez un pointeur sur votre maison (son adresse) au plombier, afin que celui-ci puisse accéder à votre maison et la réparer sur place. C’est ce que nous appelons par référence: vous transmettez non pas les données que vous souhaitez modifier, mais un pointeur sur ces données, de sorte que l’appelé sache à quel emplacement opérer et non seulement à quelle valeur .

 const int broken = 0, fixed = 1; struct House { int plumbing; }; void plumber(House *h) { h->plumbing = fixed; } int main() { struct House h; h.plumbing = broken; plumber(&h); // give the plumber the address of the house, // not a copy of the house assert(h.plumbing == fixed); } 

Dans le cas de la transmission de chaînes, vous passez un pointeur sur le premier caractère de la chaîne. Avec l’arithmétique de pointeur, vous pouvez alors accéder aux éléments suivants.

C n’a pas de passe par référence. Lorsque vous passez un pointeur sur une fonction, vous transmettez en réalité l’adresse d’une variable à la fonction. La fonction peut alors changer les valeurs à cette adresse et cette modification sera alors reflétée dans la variable lors de l’appel de la fonction. Toutefois, si vous essayez de modifier l’adresse indiquée par le pointeur, les modifications ne seront pas reflétées dans la fonction d’appel, car le pointeur était toujours transmis par valeur.

 void f(int *j) { (*j)++; int k = 20; j = &k; } int main() { int i = 20; int *p = &i; printf("i = %d, p = %p\n", i, p); f(p); printf("i = %d, p = %p\n", i, p); return 0; } 

Sortie

 i = 20, p = 0x123456 i = 21, p = 0x123456 

Chaque paramètre en C est passé par valeur.

Toutes les données sont stockées dans un emplacement particulier avec une adresse particulière. Lorsque vous transmettez par référence, vous transmettez l’adresse des données par référence. Et dire à la fonction de manipuler les données en utilisant un adressage indirect.

Lorsque vous le transmettez à une fonction, l’adresse (d’une variable) est envoyée sous forme de données, mais les données elles-mêmes sont transmises valeur par valeur.

  a=10 b=20 ------ ------- 0xf8 0Xf4 ---------- --------- Suppose a and b are two variables in a function stack when you call another function foo(&a,&b) actually 0xf8 and 0xf4 is caught in the definition of foo(int *pa,int *pb) So pa=0xf8 pb=0xf4 -------- --------- But *pa = 10 and *pb = 20 , You can manipulate like this. So these pointers start pointing to the actual data and any changes here are reflected in the original environment.