有一个pointer它指向另一个pointer:
这样的指针被称为"多级指针",多级指针的value是另一个指针的address,这样我们可以多层次来访问最终的存储单元。
比如:
int a;
int *p;
int **pi;
上面的多条语句,a是一个整型变量,而p则是一个指向整型变量的指针,那么pi是什么呢?pi的值可以是一个指向整型变量指针的address。
int a=12;
上面的语句给a变量赋值为12,但是如果:
p=&a;
我们就可以printf("%d",*p);,当然如果我们使用多级指针:
pi=&p;我们就可以printf("%d",**pi);
在上面的多次赋值以后一下的表达式结果是true:
a==12
a==*p
a==**pi
&a==p
&a==*pi
&p==pi
对一个多级指针进行*运算可以得到一个指针的值,如果我们根据它的级数依次求值可以得到最终给定type的变量。其实多级指针并不复杂的。
array and pointer有关系吗:
在c中array这种特殊的type是怎么实现的呢?array中的all elem是顺序存储的,elem之间的关系只不过是依次的递增关系而已,除此之外没有任何关系了。
int array[length];
在c中可以以上面的语法声明一个最简单的array,array中的elem type是int而这个array最多可以save length个elem。
问题在于数组名它代表的是什么,数组名有时候是数组中第一个元素的首地址,但其实它是一个指针常量,因为之前提到过变量对应一个address,数组名也对应一个address,并且我们无法改变数组名的值,它并不是一个"左值".
经过上面的阐述以后我们可以这样来完整的描述数组名到底是个什么东西:
int *pointer=arrayname;
上面的声明语句,声明了pointer是一个指向整型的指针变量,并用一个数组的名字为它初始化。上面的语句和下面的语句效果一样:
int *pointer=1001a20b;
我们把数组名用一个内存地址替换了,其实数组的名字就和普通变量一样,arrayname对应一个memory address。这个地址是数组的首地址,也就是下标为0元素的第一个字节的地址。