指针的一些注意事项

文章详细阐述了指针的概念,指针是一个常量,而指针变量是可以改变的。解引用指针获取的是左值而非右值。void*类型的指针不能直接解引用或进行加减运算,因为它指向void类型。关于_freeList的类型为void*,文中解释了表达式_freeList=*((void**)_freeList)的含义,即获取void*指针所指空间的前8个字节作为新地址,可能用于改变_freeList的指向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的指向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值