困惑于二维结构的指针

时间:2015-10-14 18:42:30

标签: c pointers multidimensional-array struct

我正在使用malloc创建动态结构。我的结构看起来像这样:

typedef struct
    {
        int v=;
        int t;
        struct a *prev;//points to previous struct in same row
        struct a *next;//points to next struct in same row
        //Is this correct notation?
    } a;
    a **b;

在初始化期间,我这样做:

for(i=0;i<d1;i++)
    {
        for(j=0;j<d2;j++)
        {
            if (j==0) //if first block, point to NULL
                b[i][j]->prev = NULL;
            else //else point to previous block.
                b[i][j]->prev = *(b[i] + j - sizeof(b[i][j]));
        }
    }

我收到错误无效的类型参数。这有什么不对?对于prev,我试图首先找到当前块*(b[i]+j)的地址并获取前一个块的地址,减去每个块的大小,即sizeof(b[i][j])

2 个答案:

答案 0 :(得分:1)

b[i][j]不是指针。因此,你不能使用:

b[i][j]->prev = NULL;

使用

b[i][j].prev = NULL;

<强>更新

可以使用以下方法创建对象之间的链接:

for(j=0;j<d2;j++)
{
    // Fix the prev link
    if (j==0) //if first block, point to NULL
        b[i][j].prev = NULL;
    else //else point to previous block.
        b[i][j].prev = &b[i][j-1];

     // Fix the next link
    if (j==d2-1) //if last block, point to NULL
        b[i][j].next = NULL;
    else //else point to next block.
        b[i][j].next = &b[i][j+1];

}

答案 1 :(得分:1)

我猜你希望每行中的元素都被链接,但不能与之前的行相对应。我的看法:

void
fill(void)
{
    int d1;
    int d2;
    a **b;
    a *x;
    int i;
    int j;

    d1 = 10;
    d2 = 20;

    b = calloc(d1 * d2,sizeof(a));

    x = &b[0][0];

    for (i=0;  i<d1;  i++) {
        x->prev = NULL;
        x->next = x + 1;
        for (x++, j=1;  j<d2;  j++, x++) {
            x->prev = x - 1;
            x->next = x + 1;
        }
        x[-1].next = NULL;
    }
}

更新:

向指针添加n时的指针运算。如果n为1,则在地址中添加1,您需要添加sizeof(* ptr)。请考虑以下所有内容都是等效的:

int *xp;
int n;

(A1) xp += n;
(A2) xp = (int *) (((unsigned long) xp) + (n * sizeof(int)))
(A3) xp = &xp[n];
(A4) xp = (int *) (((char *) xp) + (n * sizeof(int)))

盯着这一段时间,直到你真正理解为什么这是真的。这是。添加到指针的值应该与相同类型的数组的索引值完全相同。

您的代码在某些方面被打破:
- 您需要将b[i][j]->prev替换为b[i][j].prev,因为b[i][j]已经完全取消引用指针[其他人指出了] - 当您执行*(b[i] + j - sizeof(b[i][j])时,我甚至不确定您将获得什么。
- 你想要&b[i][j-1](A3)。你的代码[如果它可以工作],可能产生&b[i][j-18] - 这是因为你的混合指针算术和字节大小(例如你正在进行上面的(A1),(A2)和(A3)的混搭 - 你可以使用其中一个但不是两个/全部在同时)

我的代码只需要一个在开头设置的指针,因为它在内循环中递增1。 请注意,在完成&#34; j循环&#34;后,x == &b[i][d2]也是&b[i+1][0]。这可能有助于使其更清晰 另外,我在内部j循环之前处理j == 0的情况并且发布修复&#34; j == d2-1&#34;之后的情况。这样,如果内循环内部没有,为什么它从1开始,而不是0 请注意,x[-1].next(案例A3)为(x - 1)->next(案例A1)

这里的循环稍微重新编码,以便更简单/更快。它假设一个加法变量:a *ep;

for (i=0;  i<d1;  i++) {
    x->prev = NULL;
    x->next = x + 1;
    ep = x + d2;
    for (x++;  x<ep;  x++) {
        x->prev = x - 1;
        x->next = x + 1;
    }
    x[-1].next = NULL;
}

我认为您已经足够让您的代码正常运行。在那之后,尝试理解你的代码与我的代码,以及为什么两者都按照他们的方式工作。这样做会让你在处理指针和指针算法方面有所作为,它很快就会像通过普通固定大小的数组索引一样容易。快乐编程......