指针和引用的区别:
这里对于c++中的指针和引用的区别做一个简单的总结!
1. 非空区别
在任何情况下都不能使用指向空值的引用,一个引用必须总是指向某些对象。因此如果你使用某一个变量让它指向对象,但是该变量在有些时候可能不指向任何对象,这个时候你应该把它声明为指针,这样你就可以赋空值给该变量。相反的,如果某个变量指向一个对象且你不允许这个对象为空值,这个时候你就将它声明为引用(也许有点绕…)。不存在指向空值的引用也说明使用引用的代码效率比指针高。
上代码–>在 note1 时:
#include<iostream>
int main()
{
int a = 1;
int &ref = a ; //note1
int *p; //指针可以为空
//int &ref; //note2
std::cout<< ref << std::endl;
}
输出:
note2时候的输出:
代码2:
#include<iostream>
int main()
{
int a = 1;
int b;
int &ref = a ;
int *p = &b;
b = 5;
std::cout<< ref << std::endl;
std::cout<< *p << std::endl;
std::cout<< p << std::endl;
}
输出:
2. 判断合法性
在使用引用之前不需要测试它的合法性,相反,指针总是应该被测试,防止其为空,因为声明的指针是可以不指向任何对象的,所以要进行判空操作。
3. 是否可修改
指针可以被重新赋值指向另一个对象,而作为引用,总是指向初始化时被指定的对象,以后不能改变,但是其指定对象的内容可以改变。
4. 应用区别
总的来说,以下情况应该使用指针:1、考虑到存在不指向任何对象的可能;2、需要在不同的时刻设置不同的对象。如果只是指向一个对象且指向一个对象之后不再改变,那么推荐使用引用。
Example:
#include<iostream>
int main()
{
int v1;
int v2 = 1024;
int v3 = 999;
int &ref1; //错误,没有对于引用初始化
int &ref2 = v1; //正确,声明引用同时初始化,ref2是v1的别名
int &ref3 = v1; //正确,同上
int *p;
*p = 5; //错误,指针p没有指向实际的地址,这种情况下赋值赋的值不知道放到那里去,所以是错误的
p = &v3; //正确,p指向v3实际的地址
const double x1; //错误,const常量必须初始化
const double x2 = 10.0;
const double x3 = 0.5;
const double *p1 = &x2;
std::cout << p;
return 0;
}
欢迎指正!