个人对指针的指针理解

每次一看到两个*号,就头疼,终于在一次看源代码时,看了半天才弄明白其中含义,所以写一写对指针的指针的理解。

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停止符为止

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值