指针与指针的引用、指针的指针
本文简单辨析一下C/C++中的几个概念。
指针
在C和C++中都存在指针的概念。
- 指针的本质:一个变量。
- 指针的类型:指针类型(与指向的类型有关)。
- 指针的内容:地址。
如:
int a = 1;
int *pa = &a;
简单来说,指针也是一个变量,如上中的pa是一个指针变量,这个变量所存的内容是变量a的地址,pa的值如果输出出来大概是这个样子:0xbff405f8。
在C语言中,要想改变函数参数,必须传入一个指针。如:
void change(int a)
{ a ++; }
void real_change(int *a)
{ (*a) ++;}
int a = 1;
int *ptr = &a;
change(a);
real_change(ptr);
学过C语言的都知道,调用上面的change函数是不能真正改变变量a的值,必须调用下面的real_change函数才能改变。另外,这个指针变量也像普通的变量一样,有一个存储地址,这个地址可以使用取地址操作符&得到。
引用
引用是C++里的概念,简单的来说,引用是变量的一个别名。通过引用可以达到C语言中指针的效果,但是又不需要繁琐的指针操作。
void change(int &a)
{ a ++; }
int a = 1;
change(a);
这样使用就可以改变变量a的值。
指针的指针
指针的指针很好理解,实际上就是把指针变量当成普通的变量来看待,那么指针的指针所存的就是指针变量的地址。
int a = 1;
int *ptr = &a;
int **ptr_ptr = &ptr;
那么指针的指针有什么用呢?我们将指针作为参数传入函数的初衷是想通过函数改变指针所指变量的值,因此使用指针的指针可以改变指针的指针指向的指针的值。比较拗口,用上面的代码举个例子:ptr_ptr是一个指向指针ptr的指针,因此通过ptr_ptr可以改变指针ptr的值,也就是改变指针变量ptr所存的值,换句话说就是改变指针ptr的指向。比如:
void change_ptr(int *p)
{
p = NULL;
}
void real_change_ptr(int **P)
{
(*p) = NULL;
}
通过change_ptr想改变p的指向,但是通过上面的分析就知道这不能实现,必须通过real_change_ptr这样的调用形式来实现。
指针的引用
上面说道,C++中使用引用可以避免繁杂的指针操作,于是把指针的指针改成指针的引用更加符合C++的习惯。
void change_ptr(int *p)
{
p = NULL;
}
void real_change_ptr(int *&P)
{
p = NULL;
}
有了上面的基础,我们知道上面这个change_ptr是不能改变p的指向(这是我犯过的一个错误),必须使用下面的real_chang_ptr这样的调用形式。