一、引用和指针在概念上的区别ios
引用是变量的别名,引用必须在一开始就被初始化,并且其引用的对象在整个生命周期中是不可改变的(自始至终都只能依附于同一个变量),之后对引用的操做其实就是对变量的操做。引用通常是用于处理函数的参数与返回值。例如:程序员
指针是一个变量,其存放的是另外一个变量的地址。例如:安全
因此经过指针能够对变量的地址进行直接操做,这样程序员有着更加灵活的选择,可是,指针会带来更多的不安全因素。所以做为一个变量的指针,其在逻辑上是独立的,它能够被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。ide
引用的大小是所指向的变量的大小,指针是指针自己的大小,4个字节。函数
引用比指针更安全。因为不存在空引用,而且引用一旦被初始化为指向一个对象,它就不能被改变为另外一个对象的引用,所以引用很安全。对于指针来讲,它能够随时指向别的对象,而且能够不被初始化,或为NULL,因此不安全。const 指针虽然不能改变指向,但仍然存在空指针,而且有可能产生野指针(即多个指针指向一块内存,free掉一个指针以后,别的指针就成了野指针)。spa
二、引用和指针在函数传参数时的区别指针
指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程当中,被调函数的形式参数做为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特色是被调函数对形式参数的任何操做都是做为局部变量进行,不会影响主调函数的实参变量的值。(这里是在说实参指针自己的地址值不会变)orm
引用传递过程当中,被调函数的形式参数也做为局部变量在栈中开辟了内存空间,可是存放的是主调函数放进来的实参变量的地址。被调函数对形参的任何操做都被处理成间接寻址,即经过栈中存放的地址访问主调函数中的实参变量。正由于如此,被调函数对形参作的任何操做都影响了主调函数中的实参变量。
对象
#include <iostream>blog
using namespace std;
void FuncA(int &n)
{
n++; //存放的是主调函数放进来的实参变量的地址,会直接影响主调函数变量的值。
cout<<"now the value is "<<n<<endl;
}
void FuncB(int* n)
{
(*n)=(*n)+1; //这里n是指向实参的地址,若是写成:n=n+1则是改变n指向的变量;只有(*n)才是对n指向变量的内容作修改,修改以后,主函数中b的值也就变了。
cout<<"now the value is "<<(*n)<<endl;
}
int main()
{
int a=10;
int b=10;
FuncA(a);
cout<<"a="<<a<<endl;
FuncA(a);
cout<<"a="<<a<<endl;
FuncB(&b);
cout<<"b="<<b<<endl;
FuncB(&b);
cout<<"b="<<b<<endl;
return 0;
}