2016-07-11 40 views
0

我有點困惑與下一statment實施:馬爾可夫鏈。實施添加方法

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和閱讀關於指針,但無法探索這個添加函數behaviore爲我自己。

+0

的printf( 「前綴%d的大小」,&前綴);是錯誤的 – 4pie0

+0

我只是想得到答案。請不要關心我的printf函數。問題不在於它。 –

回答

1

所以前綴是類型爲char的指針。在這個術語prefix + 1是 到數組中的下一個char的鏈接,不是嗎?

不,是的。 prefix不是指向char的指針,而是指向charNPREF指針的數組。該數組的大小是

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

和是prefix + 1是後&prefix[0]因爲prefix(這是陣列)衰減到指針數組的第一個元素的下一個元素的地址。 所以

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

mommoveNPREF - 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] 
+0

哦,非常感謝。你讓我今天一整天都感覺很好。 –

0

memmove將移動n-1個指針一個倒退。

考慮它的第二個爲memcpy,關於2個不同的陣列操作:

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