每次一看到两个*号,就头疼,终于在一次看源代码时,看了半天才弄明白其中含义,所以写一写对指针的指针的理解。
int main()
{
long t = 100000006;
long *a = &t;
long **b = &a;
cout<<*(short **)b;
system("pause");
return(0);
}
以一个小例子来说明:
我们将a指针称为一级指针(因为a指针变量存储的地址存储的是一个具体的数值或者字符,反正不再是地址值)
b称为二级指针,因为b是指向指针的指针,以此类推long ***就是三级指针
我认为在考虑多级指针的时候,一定要抓住不变的量,也就是这个指针变量自身存储的是什么,如果存储的是地址,那么该地址指向哪一块。比如程序中a指针自身存储的是变量t的地址,该地址指向的值(或者说该地址存储的值)是100000006。而b指针自身存储的是a指针的地址,该地址指向的值是t变量的地址。
当这些不变的量明确以后,我们再来看cout<<*(short **)b;这句程序。首先忽略强转类型,可以发现是*b,所以cout的值一定和t变量的地址有关,因为已经知道b存储的是地址,指向的是地址,对b取星号,一定得到的是地址值(除非强转成一级指针)。然后再看强转类型,其实这里强转类型有很多可以达到同一目的,就是获取t的地址,比如int**,int***,int****,char***,long**,long***等等。这是由于所有二级以上的指针加*号,比如*(int**),*(int***)等都是从指向地址开始往后取四个字节,因为地址统一都是四个字节,所以指向指针的指针取地址都是这样。这里也就对比了比如char*变量只会取1个字节,unsigned int*取四个字节,long*取8个字节等等。有一个小技巧就是你想指定取从地址开始的几位,就可以先强转指针比如我想取四个字节, 可以*(insigned int*)(ptr)这样就可以取出ptr指针指向地址的后四个字节。所以无论指针再怎么强转,它本身的值以及指向的值是不会变的,变得只是使用该指针时,需要往后取几个字节
但是这里cout<<*(char **)b;是不可以的,这是由于cout的原因,因为cout会把char*指向的字符串的值全部输出出来,并且也不是只取一个字节,会取到出现/0停止符为止。