很抱歉,如果只是我正在摸着头看这段代码,但有人可以解释这个链表是如何存储的?
特别是我对这个操作*((Particle**)p) = (p++)+1;
感到困惑 - 如何解释左侧指针的操作?
#include <stdio.h>
typedef struct Particle_s {
int myint;
char test_string[10];
} Particle;
#define maxParticles 10
static Particle particleBuf[maxParticles]; // global static array
static Particle* headParticle;
void initParticleAllocator()
{
Particle* p = particleBuf;
Particle* pEnd = particleBuf+maxParticles-1;
// create a linked list of unallocated Particles
while (p!=pEnd)
*((Particle**)p) = (p++)+1;
*((Particle**)p) = NULL; // terminate the end of the list
headParticle = particleBuf; // point 'head' at the 1st unalloc'ed one
}
Particle* ParticleAlloc()
{
// grab the next unalloc'ed Particle from the list
Particle* ret = headParticle;
if (ret)
headParticle = *(Particle**)ret;
return ret; // will return NULL if no more available
}
void ParticleFree(Particle* p)
{
// return p to the list of unalloc'ed Particles
*((Particle**)p) = headParticle;
headParticle = p;
}
int main(int argc, char **argv)
{
int i;
initParticleAllocator();
for( i=0; i<maxParticles; i++) {
Particle* newparticle = ParticleAlloc();
printf("test cell %d (0x%x - 0x%x)\n", i, &particleBuf[i], newparticle);
}
getc(stdin);
return 0;
}
答案 0 :(得分:1)
这段代码完成的操作是:数组'particleBuf'的每个成员都被初始化为数组的下一个成员的地址 - 直到最后一个元素,它被初始化为null。
这样,每当你需要在链接列表中添加一个新成员时,你可以通过读取一个数组元素获取下一个要放入它的粒子,然后更新headParticle指向数组的下一个成员