指针学习

本来以为对指针已经有所了解了  工作中遇到以下代码,瞬间懵了,请看。

static inline void * SLL_Next(void *t)

{

      return*(reinterpret_cast<void**>(t));

}

static inline void SLL_SetNext(void *t, void*n)

{

      *(reinterpret_cast<void**>(t))= n;

}

static inline void SLL_Push(void **list, void*element)

{

      SLL_SetNext(element,*list);

      *list= element;

}

static inline void * SLL_Pop(void **list)

{

      void* result = *list;

      *list= SLL_Next(*list);

      returnresult;

}

 

查了一上午,问题解决了,不禁佩服前辈写代码的功力。记录一下解决问题的过程吧。

1.   reinterpret_cast 介绍

reinterpret_cast是C++里的强制类型转换符。它并没有改变变量内存中的值,与原始参数有完全相同的比特位。只是对这个变量进行重新解释。

 

 

 

2.   SLL_Next 函数解析

reinterpret_cast<void**>(t)

这句话表示的是将t的类型强制转成void **类型,t本来是void*类型的。

那就要对指针有很好的理解。

上图:


ppa中存储的是pb的地址,那么*ppa表示的是 pb的值。也就是内存A中的值。

而pb中存储的是b的地址,所以,我们**ppa表示的是b的值。

 

那么上面函数表示的是什么意思呢?

我们分开写啊

static inline void * SLL_Next(void *t)

{

      void**tmp= reinterpret_cast<void**>(t);

      return*tmp;

}

 

 

一级指针t中存储的是内存A的地址。

把一级指针t强转成二级指针tmp,tmp中存储的同样是内存A的地址,那么*tmp表示的是谁????   对比上面的*ppa,我们知道了,原来*tmp中存储的是内存A中的值。

也就是说:这个函数传入的内存A的地址,返回的是内存A中值。

 

 

 

3.   static inline void SLL_SetNext(void*t, void *n)

{

      *(reinterpret_cast<void**>(t))= n;

}

这个函数是将t所指向的内存,初始化为n,这个n是一个指向另一块内存的地址。

 

 

 

4.   static inline void SLL_Push(void**list, void *element)

{

      SLL_SetNext(element,*list);

      *list= element;

}

这个函数就是把 element指向的内存赋值为list指向的内存,然后,list指向element,这样就可以完成在头部插入元素了。

 

 

 

 

5.   static inline void * SLL_Pop(void**list)

{

      void* result = *list;

      *list= SLL_Next(*list);

      returnresult;

}

这个函数返回,list指向的内存的内容。然后,list指向list指向内存的内容指向的内存。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值