本来以为对指针已经有所了解了 工作中遇到以下代码,瞬间懵了,请看。
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指向内存的内容指向的内存。