很早接触过指针和引用,每次像是搞明白了但却又很快就忘。特写一个程序以表明他们的作用。
《VC++深入详解》P56
int a=5;
int &b=a;
int c=6;
b=c;//此处并不是将b变成c的引用,而是给b赋值,此时,a和b的值都变为了6;
引用和用来初始化引用的变量指向的是同一块内存,因此通过引用或变量可以修改同一块内存中的内容。引用一旦初始化,它就代表了一块特定的内存,再也不能代表其它的内存。
引用和指针的区别:
引用只是一个别名,是一个变量或对象的替换名称,引用的地址没有任何意义。C++也没有提供访问引用本身地址的方法,引用的地址就是它所引用的变量或对象的地址。 对引用的地址所做的操作就是对被引用的变量或对象的地址所做的操作。
指针是地址,指针变量要存储地址,因此要占用存储空间,我们可以随时修改指针变量所保存的地址从而使指针指向其它的内存。
引用多数用在函数的形参定义上,用函数传参时,我们经常使用指针传递,一是避免在实参占较大内存时,发生值传递复制;二是完成特殊的作用,例如,要在函数中修改实参所指向内存中的内容。同样,使用引用作为函数的形参也能完成指针的作用,有些情况下还能达到比指针好的效果。
(***下面的例子中,孙老师的意思,change若使用指针传参,则调用了
change(&x,&y),这容易让使用者迷惑:到底交换的是地址,还是值?即可读性差。从功能实现上来说,并无差异。***)
总结:
- 相同点
都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;
引用则是某块内存的别名。- 不同点
指针是一个实体,而引用仅是个别名;
引用只能在定义时被初始化一次,之后不可变;指针随时可变;
const:引用只有 const int& a;(引用所指向的值不可以变);没有int& const a;(引用本身即别名不可变,这是当然的,所以不需要这种形式);指针均有;
引用不能为空,指针可以为空;
引用是类型安全的,而指针不是;(引用比指针多了类型检查)
sizeof 引用 的到是所指向的变量(对象)的大小,而sizeof 指针得到的是指针本身的大小
专业解释见
C++中的值传递 指针传递 和 引用传递
C++ 引用【&】和【指针】在作为形参时的区别
#include<iostream>
using namespace std;
void change1(int &a,int &b);
void change2(int *a,int *b);
void main()
{
int x=3;
int y=6;
cout<<"main x地址"<<&x<<endl;
cout<<"Original x="<<x<<endl;
cout<<"Original y="<<y<<endl;
change1(x,y);
cout<<"changed1 x="<<x<<endl;
cout<<"changed1 y="<<y<<endl;
change2(&x,&y);
cout<<"changed2 x="<<x<<endl;
cout<<"changed2 y="<<y<<endl;
system("pause");
}
void change1(int& a,int& b)
{
a=a+b;
b=a-b;
a=a-b;
cout<<"change1 a 地址"<<&a<<endl;//C++并没有告诉我们,“谁来存a”;
}
void change2(int* a,int* b)
{
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
cout<<"change2 存放a的地址"<<&a<<endl;
cout<<"change2 a中存放的地址值"<<a<<endl;
cout<<"change2 a中存放的地址值所指向的内存中存放的值"<<*a<<endl;
}