先来段代码
int a = 90;
int *p;
p = &a;
*p = 3;
int **p1 = &p;
printf("%p\n%p\n",p1,&p);
putchar('\n');
putchar('\n');
printf("%p\n%p\n%p",*p1,&a,p);
putchar('\n');
putchar('\n');
printf("%d\n%d\n%d",**p1,a,*p);
putchar('\n');
解释 : 指针其实就是一个地址 上面的p其实也是一个在栈上面的变量,只不过它存储的是其它数据的地址: &a == p,那么作为一个变量它也有自己的地址&p
p1 也是一个指针变量,只不过他是指向指针的指针, 说起来比较抽象,实际还是那个初学的时候我看到 和*的时候是迷茫的,但是只要不看或者是忽略它即可,它只是申明了自己是一个指针的类型:例如block有^,闭包有->,结构体有struct等 要不然我咋知道它是指针还是基本类型。 作为一个指针,它其实还是一个变量,它的内容是变量。
那么 p = &a 就是将a的地址赋予了变量p 那么p就是我们告诉编译器我们需要根据&a也就是p的地址到相应的内存空间中 操作变量a的值,这里的P的和 intp是不一样的前者表示的是一种操作后者仅仅是代表C的一种构造类型指针变量的标志除此以外它没有卵用。
那么p作为一个变量它必须也得有自己的觉悟,它在栈上开辟存储控件辣么它也有地址&p这里的&p和p是不一样的 &p是p自己的地址 p是p所指向的存储空间的地址&a。
那么变量p1 它作为一个变量肯定必须也有自己的地址嘿嘿&p1
那么 p1就是 &p 记住在看指针的时候 一定别看前面的号你会发现指针就清除多了嘿嘿。 你看看 p1是指针变量p的地址 那么它肯定和人家a没啥关系了
p1 你想想啊 这里的我在前边说了,它是告诉编译器去操作对应的变量的存储控件也就是p的值 那么p作为一个指针变量它就是用来存储地址的嘛所以 p1其实就是 p 或者就是&a 你说是不是? 辣么问题来了 我们知道p1==p==&a,前面提到了 作为一个地址用符号可以操作地址对应的空间的值所以*p1就==p ==a拉 。
以上就是我对二级指针的一点看法,随便写的,写错拉倒。。。