(1)系统为指针分配内存,引用与绑定的对象共享内存空间;引用访问对象是直接访问,指针访问是间接访问;引用必须初始化;
(2)作为形参
指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
引用传递过程中,被调函数的形式参数也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
#include<iostream>
using namespace std;
void swap1(int i,int j){int temp=i;i=j;j=temp;}//使用数值作为形参,实参没有变化
void swap2(int *pa,int *pb){int *pt=pa;pa=pb;pb=pt;}//使用指针作为形参,指针拷贝了副本。。运行完后pa指向了b,pb指向了a,但a,b的值没有变化
void swap3(int *pa,int *pb){int temp=*pa;*pa=*pb;*pb=temp;}
void swap4(int &ra,int &rb){int rt=ra;ra=rb;rb=rt;}//使用引用作为形参,在调用函数时就像操作实参一样
void main()
{
int a1=10,b1=20;
cout<<"为交换前a1="<<a1<<",b1="<<b1<<endl;
swap1(a1,b1);
cout<<"使用数值作为形参时,交换后a1="<<a1<<",b1="<<b1<<endl;
cout<<endl<<endl;
int a2=10,b2=20;
cout<<"为交换前a2="<<a2<<",b2="<<b2<<endl;
swap2(&a2,&b2);
cout<<"使用指针作为形参时,交换后a2="<<a2<<",b2="<<b2<<endl;
swap3(&a2,&b2);
cout<<"调用了swap3()后a2="<<a2<<",b2="<<b2<<endl;
cout<<endl<<endl;
int a3=10,b3=20;
cout<<"为交换前a3="<<a3<<",b3="<<b3<<endl;
swap4(a3,b3);
cout<<"使用引用作为形参时,交换后a3="<<a3<<",b3="<<b3<<endl;
cout<<endl<<endl;
}