C++ 指向指针的指针(多级间接寻址)
指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。
指针的指针就是将指针的地址存放在另一个指针里面。
通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。
一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向 int 类型指针的指针:
int **var;
当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符,如下面实例所示:
实例
#include <iostream>
using namespace std;
int main ()
{
int var;
int *ptr;
int **pptr;
var = 3000;
// 获取 var 的地址
ptr = &var;
// 使用运算符 & 获取 ptr 的地址
pptr = &ptr;
// 使用 pptr 获取值
cout << "var 值为 :" << var << endl;
cout << "*ptr 值为:" << *ptr << endl;
cout << "**pptr 值为:" << **pptr << endl;
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
var 值为 :3000 *ptr 值为:3000 **pptr 值为:3000
看树的鸟
578***280@qq.com
通过查看 var,ptr,*pptr 的地址可以更加清晰的理解多级间接寻址的寻址过程,从结果可以看出这 3 个的地址都是一样的。
运算结果为:
看树的鸟
578***280@qq.com
周大侠
277***091@qq.com
如果二级指针难以理解,可以把一级指针看做一个基本类型,这样二级指针的使用就跟一级指针相同了。
比如:
周大侠
277***091@qq.com
TMAIAM
193***9655@qq.com
其中理解好对于一个指针 type *p 中的 p、*p 和 &p 到底是什么,那也就能够理解二级指针了。
我的方法是拆分着看,其中 * 是取值符号,& 是取地址符号;然后就把 p 当作正常的变量看待
个人理解是不要把 *p 看成整体,看成是 *(p) 更好理解。把 p 看成正常的变量名,那么 p 这里就表示这个变量的值;
运算结果为:
把 *p 里面的看成普通变量可能有点难理解,举个例子:
比如一个普通变量 int a; 我们可以理解成一个可以存放 32 位大小的盒子,这个盒子之只能放整数,里面的数据值可能是 300,那么 a 就是 300 的别名,所以我们可以说 a 是整数 300;同理但看这里的 p,在 32 位计算机中,有一个 32 位(4Byte)大小的盒子,这个盒子只能放地址,里面的地址可能是 0x61ff18,那么 p 就是 0x61ff18 的别名。所以说 a 和 p 实际上表示的都是盒子里面的值。
TMAIAM
193***9655@qq.com
缘分天空
300***67@qq.com
可以定义指针的指针的指针,也就是可以一直往后定义:
输出结果为:
缘分天空
300***67@qq.com
VALUE
phj***89905610@163.com
指针数组用来存放多个指针,即地址,可将地址看作一种特殊的值。
指针数组的数组名(即指针数组的首地址)相当于指针的指针。
返回指针数组的函数,要声明和定义为指针的指针函数。
即:
输出结果:
若将返回指针数组的函数定义为指针函数,如下:
出现如下错误:
错误 43 中,返回的 r 是 int 型的指针的指针,但是定义的函数是指针函数,不是指针的指针函数。
错误 17 中,定义的函数是指针函数,接受的 c 是指针的指针函数。(不是主要错误)。
因此在传指针进行值得交换时,也可以返回交换后得指针,此时指针存放在一个指针数组中返回,因此函数时指针的指针函数。
返回数组:函数定义为指针函数即可。详情见数组作为函数返回值。
输出结果为:
VALUE
phj***89905610@163.com