有这样一段连续的内存,int*arr=(int*)malloc(20); malloc 开辟了 20 个字节大小的空间,arr 指向这段空间的开头
我们要实现像链表一样的功能,有什么方法呢?(关于为什么要在一段连续的空间上实现像链表一样的功能,这只是一个例子,在实际应用中,是将不连续的一段段空间用链表的方式连接起来)
我们可以取该空间前 4 或 8 个字节的大小,来存放下一个段内存的地址
为什么是 4 或 8 个字节?
因为计算机的处理器(CPU)一次能处理的数据不一样,在 32 位平台下,CPU 一次能够处理 32 位数据(也就是 4 字节),也就是说 32 位平台的寻址能力是 32 位,而指针,也就是地址,是以 32 个比特位表示的,所以指针的大小是 32 位,也就是 4 字节,同理,在 64 位平台下,CPU 一次能够处理 64 位数据(也就是 8 字节),指针以 64 个比特位表示,所以指针的大小是 是 64 位,也就是 8 字节。
那么我们只有指向这段空间开头的指针 arr,怎么获取 前 4 或 8 个字节的空间呢?
*(int**)arr 取到的就是前4 或 8 个字节的空间,arr 是指向这段空间开头的指针,(int**)arr 是把 arr 转化成 int**类型,但是 arr 的值还是不变呀,然后*(int**)arr 得到的空间还是 arr 所指向的空间,只不过类型变成了 int*类型,这样一来,就可以解决指针在不同平台下大小不一致的问题了,然后得到的这个空间可以用来存放下一段内存的地址,就可以把几个不连续的空间连接起来了