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

时间:2016-07-11 08:54:56

标签: c markov-chains memmove

我对实施中的下一个陈述感到困惑:

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(前缀,前缀+ 1,(NPREF - 1)* sizeof(前缀[0]));

因此前缀是char类型的指针。在这个术语中,前缀+ 1是指向数组中下一个字符的链接,不是吗?

它是如何以正确的方式运作的?我已经阅读了关于memmove的内容并阅读了有关指针的信息,但无法自己探索这个添加函数的行为。

2 个答案:

答案 0 :(得分:1)

  

因此前缀是char类型的指针。在这个术语中prefix + 1是   指向数组中下一个char的链接,不是吗?

不,是的。 prefix不是指向char的指针,它是指向NPREF的{​​{1}}指针数组。这个数组的大小是

char

和是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

答案 1 :(得分:0)

memmove会向后移动n-1个指针。

将它作为memcpy考虑一下,它在2个不同的数组上运行:

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