一级指针变量可以指向(存储)变量的地址,例如 int * ip , double * dp等
一级指针也是变量,如果要存储一级指针变量地址,就定义二级指针变量,二级指针变量就是存储一级指针变量地址。
int main()
{
int a = 10, b = 20;
int* p1 = &a;
int* p2 = NULL;
int** s = &p1; // 二级指针,存放的是p1的地址,而p1也是指针,存放的是a的地址
*s = &a;
**s = 100; // 实际上改变的是a本身
}
s存放的是p1的地址,*s就是p1本身,p1存放的是a的地址,*p1就是a本身,因此**s就是a本身
二级指针++ 的情况
s + 1 加4字节,因为s是二级指针,s + 1 是从p0 到p1 ,他们都是指针,因此加的是4字节
*s + 1 加的是a0 ,a1 等类型的大小,如果是int型那么加的就是4,double型加的就是8
**s + 1 加的是a0 , a1 等存放的值加1
也就是:
s + 1 = s + sizeof(typename*) * 1;
*s + 1 = *s + sizeof(typename) * 1;
如果int ** s 中放的是ar0 的首地址,那么s + 1能不能指向ar1呢?
不能,s + 1 = s + sizeof(typename*) * 1; 充其量只能加4字节
那么怎么才能满足呢? int (*s)[4]
遇到括号先解释括号里面的,再解释括号外的,首先s是指针变量,开辟四字节,能存放数组地址,这个数组开辟4个空间,每个空间都是整型
ar 代表数组首元素地址,&ar代表整个数组的地址,虽然内容一样但是ar++ 加的是4字节,&ar++加的是整个数组的地址
ar2[3] 表示*(*(ar+2)+ 3) ,也可以写成ar[2][3]
注意区分int *s[4] 和 int (*s)[4]
前面s先和数组结合,s是一个数组,存放的是int* 指针变量
而后面的s与*结合,说明s是指针,指向的是数组的地址,这个数组空间是4,每个元素为整型