1.注意指针完全等价于地址,指针就是一个常量,指针和指针变量是不同的,指针变量才是一个变量。
2.假如有int a=10,然后 int*p=&a,此时与 *p等价的是变量a,而不是常量10,因为我们可以通过*p=11将变量a修改成11,如果 *p等价于常量10,那么10=11肯定是不被允许的。所以我想说的是解引用一个指针后拿到的是左值,而不是右值。
3.void*类型的指针是不能解引用和进行加减操作的,因为void*类型的指针指向void类型,void类型是没有意义的。
4._freeList的类型是void *,是个指针,指向一块已经开辟好了的空间。此时当你看到一行代码如_freeList = *((void**)_freeList),你认为这是什么意思呢?
假如此时_freeList的值为0x123,地址0x123上存的值为5,不要认为_freeList被强转成二级指针后,_freeList的值也跟着发生变化了,即不要认为_freeList被强转后,_freeList的指向也跟着变化了。事实上_freeList的值不变,值还是为0x123,即_freeList的指向不变。但注意,_freeList被强转后,生成的临时变量因为是二级指针,所以解引用后得到的变量的类型为一级指针,只不过目前指针的值就是5,而不是0x123。将指针强转一般只有两种意义:
其一是指针强转后,解引用时能访问到的字节数发生了改变,比如说,现在有int*p指向一块10字节的空间,因为p的类型是int*,p是个整形指针,所以 *p 就只能访问一个整形所占的字节数,即4字节,如果将p的类型强转成 int**,那么p就是一个指针类型的指针,所以*p就能访问一个指针类型所占的字节数,即8字节,所以 *(int**)p就能访问该地址上的前8个字节。
其二是将指针变量赋值给别人时,因为双方类型不同,所以需要强转,如下:
double*d= xxxx;
int *p=(int*)d;
那么话说回来,_freeList的类型是void *,是个指针,指向一块已经开辟好了的空间,那么当你看到语句_freeList = *((void**)_freeList),它表示什么意思呢?
答案:_freeList是个指针,指向一块空间,但注意它只指向这块空间的首地址,读了上文我们可以分析出语句 *((void**)_freeList)的目的是为了拿到这块空间从首地址开始的8个字节的数据,当这8个字节所代表的数据是一个地址,那么_freeList = *((void**)_freeList)就相当于用指针_freeList指向空间的前8个字节组成的数据(数据即某个地址)给_freeList重新赋值,也就是修改_freeList的指向。