Parmi les paramètres, la différence entre le passage de valeur, le passage de pointeur et le passage de référence

Transfert de valeur: le
paramètre formel est une copie du paramètre réel et la modification de la valeur du paramètre formel n'affectera pas la valeur du paramètre réel externe. Du point de vue de la fonction appelée, le transfert de valeur est unidirectionnel (paramètre réel -> paramètre formel) Une fois l'affectation terminée, le paramètre réel n'a plus de lien avec le paramètre formel. Lorsque les paramètres doivent être modifiés à l'intérieur de la fonction et que vous ne voulez pas que cette modification affecte l'appelant, passez par valeur.

#include<stdio.h>    //值传递示例
void swap(int a,int b)
{   //拷贝临时变量 
	int temp=a; 
	a=b;
	b=temp;
};  //函数调用后a和b的值进没有达到交换目的 
int main()
{ 
	int a=1, b=2;
	swap(a,b);
	printf("a=%d,b=%d", a, b);
    //输出结果a=1,b=2,a和b的值没有改变
	return 0;
}

 

Transfert de pointeur: le
paramètre formel est un pointeur vers l'adresse du paramètre réel. Lorsque le pointeur est actionné sur le paramètre formel, il équivaut à l'opération sur le paramètre réel lui-même.

Le paramètre de passage du pointeur est essentiellement un moyen de transmettre des valeurs, ce qu'il transmet est une valeur d'adresse. Pourquoi dit-on que le passage d'adresse est aussi une sorte de transmission de valeur? Parce que l'adresse de transfert consiste à transférer une copie de l'adresse de paramètre réelle vers le paramètre formel. En un mot, passer l'adresse, c'est copier l'adresse du paramètre réel dans le paramètre formel.Après la copie, il n'y a pas de lien entre l'adresse du paramètre réel et l'adresse du paramètre formel. Ensuite, la modification du point de pointeur dans la fonction n'affecte pas l'instance de pointeur en dehors de la fonction. Mais lorsque la valeur de la variable pointée par le pointeur est modifiée dans la fonction, la valeur de la variable pointée par le pointeur de paramètre réel de la fonction principale change.

#include<stdio.h>    //指针传递示例
void swap(int *a,int *b)
{     //int *是一个整体,表明变量类型是指针
    int temp=*a;
    *a=*b;
    *b=temp;
}
int main(){
   int x=1, y=2;
   swap(&x,&y);
   printf("x=%d,y=%d",x, y);
   //输出x=2,y=1, x和y的值改变了
}

 

Passer par référence:
& représente un argument de référence, ce qui signifie que le paramètre formel est un alias du paramètre réel. La variable de référence d'opération est la variable d'argument d'opération. Il s'agit de la syntaxe C ++, qui n'est pas prise en charge par la norme C.

Dans le processus de transfert de référence, bien que les paramètres formels de la fonction appelée soient également utilisés comme variables locales pour ouvrir de l'espace mémoire dans la pile, à ce moment l'adresse de la variable de paramètre réelle introduite par la fonction appelante est stockée. Toute opération de la fonction appelée sur les paramètres formels est traitée comme un adressage indirect, c'est-à-dire que la variable de paramètre réelle dans la fonction appelante est accessible via l'adresse stockée dans la pile. Pour cette raison, toute opération effectuée par la fonction appelée sur les paramètres formels affecte les variables de paramètre réelles dans la fonction appelante.

#include<stdio.h>    //引用传递示例
void swap(int &a,int &b)
{   
	int temp=a; 
	a=b;
	b=temp;
};  //函数调用后a和b的值进行了交换 
int main()
{ 
	int a=1, b=2;
	swap(a,b);
	printf("a=%d,b=%d", a, b);
    //输出a=2,b=1, a和b的值改变了 
	return 0;
}

La différence entre les références et les pointeurs:

Le pointeur pointe vers un bloc de mémoire et son contenu est l'adresse de la mémoire pointée, tandis que la référence est un alias d'un bloc de mémoire et que le point ne peut pas être modifié après l'initialisation de la référence. Lorsqu'elles sont utilisées, les références sont plus sûres et les pointeurs sont plus flexibles.

  Auteur: wxquare Source: savoir presque

  1. initialisation. La référence doit être initialisée et ne peut pas être modifiée après l'initialisation; le pointeur n'a pas besoin d'être initialisé et le pointeur peut modifier l'objet pointé
  2. Valeur nulle. Un pointeur peut pointer vers une valeur nulle et il n'y a aucune référence à une valeur nulle. Lorsqu'une référence ou un pointeur est passé en paramètre, lorsque nous obtenons une référence, nous n'avons pas besoin de juger si la référence est vide, mais lorsque nous obtenons un pointeur, nous devons juger s'il est vide. Ceci est souvent utilisé pour juger si les paramètres de la fonction sont valides.
  3. Lorsque la référence et le pointeur pointent sur un objet, la création et la destruction de la référence n'appelleront pas le constructeur de copie et le destructeur de la classe. Supprimer un pointeur appellera le destructeur de l'objet. Veillez à éviter une destruction secondaire.
  4. Références et pointeurs et const. Il y a des pointeurs constants et des pointeurs de référence constants, indiquant que l'objet pointé est une constante et que la constante ne peut pas être modifiée par des pointeurs ou des constantes; il y a une constante de pointeur, mais il n'y a pas de constante de référence, car la référence elle-même ne peut pas modifier le les caractéristiques du pointeur et les caractéristiques de la constante du pointeur sont les mêmes. Constantes de référence.
  5. L'effet de l'utilisation de pointeurs ou de références lors de la transmission de paramètres de fonction est le même. Ils manipulent tous deux de manière concise les variables associées dans la fonction appelante. Les références à ce moment-là seront plus sûres, car certaines modifications apportées aux pointeurs n'affecteront pas les variables associées dans la fonction appelante. Par conséquent, utilisez des références lorsque vous passez des paramètres autant que possible.
  6. La taille du pointeur fait référence à la taille de l'objet et la taille du pointeur est la taille du pointeur lui-même.
  7. L'implémentation des références et des pointeurs est la même. L'affirmation selon laquelle «les références ne sont qu'un alias et n'occupent pas d'espace mémoire» est erronée. En fait, les références utiliseront également l'espace mémoire.

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42467709/article/details/81093423
conseillé
Classement