引用是C++中的概念,下面这个程序中,n 是m 的一个引用(reference),m是被引用物(referent)。
int m;
int &n = m;
其实n就 相当于m 的别名(绰号),对n 的任何操作就是对m 的操作。
引用和指针的区别如下:
1. 指针是一个实体,而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用; 3. 引用只能在定义时被初始化一次,之后不可变;指针可变; 4. 引用没有 const,指针有 const; 5. 引用不能为空,指针可以为空; 6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小; 7. 指针和引用的自增(++)运算意义不一样; 8.从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。
具体区别通过下面一个程序来做讲解:源码如下
//引用变量与指针变量的用法区别 #include <iostream> #include <stdio.h> using namespace std; #define PAUSE cout << endl << "press enter to continue" << flush;getchar();cout << endl; void ptr_swap(int *,int *);//按地址调用 void ref_swap(int &,int &);//按引用调用 void ref_ptr_swap(int *&,int *&);//按指针的地址调用
int main() { int x = 10,y = 20; int *px = &x; int *py = &y; cout << "Current values: " << endl; cout <<"\tx = " << x << "\t\t" << "y = " << y <<endl; ptr_swap(&x,&y); cout << "after calling swap: " << endl; cout <<"\tx = " << x << "\t\t" << "y = " << y <<endl; PAUSE cout << "Current values: " << endl; cout <<"\tx = " << x << "\t\t" << "y = " << y <<endl; ref_swap(x,y); cout << "after calling swap: " << endl; cout <<"\tx = " << x << "\t\t" << "y = " << y <<endl; PAUSE cout << "Current values: " << endl; cout <<"\tx = " << x << "\t\t" << "y = " << y <<endl; ref_ptr_swap(px,py); cout << "after calling swap: " << endl; cout <<"\tx = " << *px << "\t\t" << "y = " << *py <<endl; PAUSE cout << "the job is done!" <<endl; return 0; } void ptr_swap(int *px,int *py) { int temp = *px; *px = *py; *py = temp; return; } void ref_swap(int &rx,int &ry) { int temp = rx; rx = ry; ry = temp; return; } void ref_ptr_swap(int *&sx,int *&sy) { int *temp; temp = sx; sx = sy; sy = temp; return; }
该程序用swap()函数演示引用变量与指针变量的用法,swap()函数对收到的两个int类型值进行交换。运行结果如下
ptr_swap()这个函数期待接收要交换的数值的变量的指针。函数调用语句中的变元是变量x和y的地址,这些地址赋予指针变量px和py,在函数头中定义,结果是px成为x的指针,py成为y的指针,这样,改变px和py所指的内容就是改变变量x和y.
ref_swap()函数中,rx,ry就是x,y的引用,所以改变rx和ry就是改变x和y.
ref_ptr_swap()函数期待接受指针变量的引用,注意,这个函数不交换指向x和y指针的值,而是交换指针指。