1.指针与引用区别
- 指针是一块内存的地址值,访问变量是间接访问,引用是一块内存的别名,访问变量是直接访问.
- 引用是一个变量的别名,本身不单独分配自己内存空间,而指针有自己的内存空间.
- 引用使用时无须解引用(*),指针需要解引用.
- 引用只能在定义时被初始化一次,之后不可变;指针可变.
- 引用不能为空,指针可以为空.
- “sizeof 引用”得到的是所引用的变量(对象)的大小,而”sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小.
- 指针和引用的自增(++)运算意义不一样.
- 引用是类型安全的,而指针不是(引用比指针多了类型检查)
2.指针与引用联系
引用的主要功能是传递函数的参数和返回值,c++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递、引用传递。
2.1引用的三种用法
(1)独立引用
#include<iostream>
using namespace std;
int main()
{
int a=3;
int& b=a;//b与a绑定在一起,同生共死
cout<<b<<" "<<a<<endl;
b=5;
cout<<b<<" "<<a<<endl;
return 0;
}
(2)作为函数参数
#include<iostream>
using namespace std;
void f(int& b)//b在这里与实参a无异
{
b++;
}
int main()
{
int a=3;
f(a);//a受函数体内部影响
cout<<a<<endl;
return 0;
}
(3)作为函数返回
#include<iostream>
using namespace std;
int& f(int* p)
{
(*p)++;
return *p;
}
int main()
{
int a=3,b;
b=f(&a)*5;
f(&a)+=10;
cout<<b<<" "<<a<<endl;//输出20与15
return 0;
}
//f函数返回一个(*p)的引用,即a的引用。此引用可作为左值进行运算。
2.1指针、引用、值传递的三种
(1)”值传递”,由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响,所以n的值仍然是0
void Func1(int x)
{
x = x + 10;
}
int n = 0;
Func1(n);
cout << “n = ” << n << endl;// n = 0
(2)”指针传递”,由于Func2 函数体内的x 是指向外部变量n 的指针,改变该指针的内容将导致n 的值改变,所以n 的值成为10.
void Func2(int *x)
{
(* x) = (* x) + 10;
}
⋯
int n = 0;
Func2(&n);
cout << “n = ” << n << endl; // n = 10
(3)”引用传递”,由于Func3 函数体内的x 是外部变量n 的引用,x和n 是同一个东西,改变x 等于改变n,所以n 的值成为10.
void Func3(int &x)
{
x = x + 10;
}
⋯
int n = 0;
Func3(n);
cout << “n = ” << n << endl; // n = 10
看第二个例子和第三个例子:实际是哪个”引用”可以做的任何事情”指针都可以做”,那么为什么还要”引用”呢?
答案:用恰当的工具做恰如其分的工作.
指针能够毫无约束的操作内存中的东西,尽管指针功能强大,但是非常危险,
就像一把刀,既可以砍树,裁纸,理发,只是用一把砍树的刀用来理发有点危险而且.
3.什么情况下,不能使用引用,只能使用指针呢?
一般,在使用引用能解决问题的前提下,坚决不使用指针.
在以下情况下,你应该使用指针
- 你考虑到存在不指向任何对象的可能(在这种情况下,你您能够设置指针为空).
- 二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。