我对实施中的下一个陈述感到困惑:
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的内容并阅读了有关指针的信息,但无法自己探索这个添加函数的行为。
答案 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