值传递,指针传递,引用传递 的区别
值传递:
从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出
形参为实参的拷贝,形参有单独的内存空间,当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递
指针传递:
指针传递向形参传递的为实参的地址,即形参为一个指向实参地址的指针,形参的值为实参的地址,而形参所在的地址并不是实参的地址
对形参指向内容的修改即改变了实参的值
引用传递:
引用传递与指针传递不同是:引用传递中形参与实参的地址和参数值都是相同的,形参与实参只是名字不一样(形参相当于实参的别名)
结果:
值传递:
从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出
形参为实参的拷贝,形参有单独的内存空间,当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递
指针传递:
指针传递向形参传递的为实参的地址,即形参为一个指向实参地址的指针,形参的值为实参的地址,而形参所在的地址并不是实参的地址
对形参指向内容的修改即改变了实参的值
引用传递:
引用传递与指针传递不同是:引用传递中形参与实参的地址和参数值都是相同的,形参与实参只是名字不一样(形参相当于实参的别名)
实际上是一个对象
#include "stdafx.h"
#include<iostream>
using namespace std;
void ValueTransfer(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << a << b << endl;
cout << "形参a与b的地址为\n";
cout << &a << ' ' << &b << endl;
}
void PointerTransfer(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
cout << *a << *b << endl;
cout << "形参a与b的地址为\n";
cout << &a << ' ' << &b << endl;
}
void QuoteTransfer(int &a, int&b)
{
int temp = a;
a = b;
b = temp;
cout << a << b << endl;
cout << "形参a与b的地址为\n";
cout << &a << ' ' << &b << endl;
}
int main()
{
int x = 3;
int y = 4;
//value transfer
cout << "值传递\n";
ValueTransfer(x, y);
cout << "实参x与y地址为\n";
cout << &x << ' ' << &y << endl;
cout << "传递后实参的值为:\n";
cout << x << y << endl << endl;
//PointerTransfer
cout << "指针传递\n";
PointerTransfer(&x, &y);
cout << "实参x与y地址为\n";
cout << &x << ' ' << &y << endl;
cout << "传递后实参的值为:\n";
cout << x << y << endl << endl;
//QuoteTransfer
cout << "引用传递\n";
QuoteTransfer(x, y);
cout << "实参x与y地址为\n";
cout << &x << ' ' << &y << endl;
cout << "传递后实参的值为:\n";
cout << x << y << endl << endl;
return 0;
}
结果: