简单地说,如果一个二级指针指向一个一级指针,那么这个二级指针的值就是那个一级指针的地址。就像如果一个一级指针指向一个变量,那么这个一级指针的值就是那个变量的存储地址,这样容易理解。这么推下去三级、四级甚至N级的指针都能明白。不过由于指针的操作既难又危险,容易出错,所以一般少用三级以上的指针。
定义:
数据类型 **指针名;
或
数据类型 **指针名 = XX类型的指针地址;
使用:
指针名 是这个二维指针 的地址
*指针名 是这个二维指针 所指向的指针(即一维指针) 的地址
**指针名 是这个二维指针 所指向的指针(即一维指针) 所指向的内容
看例子:
#include <iostream>
using namespace std
void main() {
char *s = "Hello"
char **p = &s
cout<<p<<endl<<*p<<endl<<endl
int a = 3
int *b = &a
int **c = &b
cout<<c<<endl<<*c<<endl<<**c<<endl
}
运行结果:
*(a+2)+1和*(*(a+2)+1)这完全是两个东西。第二个代表a[2][1]
二维数组名代表的是这个数组首元素的地址或者可以看作二维数组第一行的地址,a+2是指向第三行的,二维数组可以看作是以行为数组名的一维数组比如
int a[2][2]
数组名是a[2]
在这里*(a+2)代表的是第三行首元素的地址,然后加1的话就是第3行第二元素的地址了。所以*(*(a+2)+1)代表a[2][1]