马尔可夫链。实现添加方法

Markov chain. Implementation add method

我对实施中的下一个陈述有点困惑:

void add(char *prefix[NPREF], char *suffix) {
    State *sp;

    sp = lookup(prefix, 1);
    //addsuffix(sp, suffix);

    printf("size of prefix %d",&prefix);
    printf("size of prefix %s", prefix + 1);
    printf("size of prefix %d \n", &prefix+1);
    for (int i = 0; i < NPREF; i++)
        printf("%s \n" , prefix[i]);


    printf("memmove \n");

    memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));
    prefix[NPREF - 1] = suffix;

    for (int i = 0; i < NPREF; i++)
        printf("%s \n", prefix[i]);

}

mmemove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));

所以prefix是一个char类型的指针。在这个术语中,前缀 + 1 是数组中下一个字符的 link,不是吗?

它是如何以正确的方式工作的?我已经阅读了有关 memmove 和有关指针的信息,但无法为自己探索此添加功能行为。

So prefix is a pointer of type char. In this terms prefix + 1 is the link to the next char in the array, isn't it?

不,是的。 prefix 不是指向 char 的指针,它是指向 charNPREF 指针的数组。这个数组的大小是

assert(sizeof(prefix) == NPREF * sizeof(char*)

是的 prefix + 1&prefix[0] 之后的下一个元素的地址,因为 prefix (数组)衰减到指向数组第一个元素的指针。 所以

memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));

mommove NPREF - 1 个元素放在一个位置。考虑到什么是马尔可夫链,这听起来很合理,但我们看不到您的实现。如果改为

memmove(&prefix, &prefix + 1, sizeof(prefix)/sizeof(prefix[0]);

然后它将 memmove 整个数组。

示例:

[0][1][2][3][4][5]...[n] /* prefix was */
[A][B][C][D][E][F]...[N]
memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0]));
[0][1][2][3][4][5]...[n] /* prefix is */
[A][A][B][C][D][E]...[M]

memmove 将 n-1 个指针向后移动一步。

暂时将其视为 memcpy,它在 2 个不同的数组上运行:

prefix
 V    
[ ][ ][ ][ ][ ][ ]
 ^  ^  ^  ^  ^
 \  \  \  \  \
  \  \  \  \  \
   \  \  \  \  \
    \  \  \  \  \
[ ][ ][ ][ ][ ][ ]
    ^
    prefix+1