2016-07-11 4 views
0

Я немного запутался со следующим даным в реализации:Марков цепи. Реализация добавить метод

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 и читал о указателях, но не мог исследовать это поведение функции add для себя.

+0

Е ("размер префикса% D", & префикс); неверно – 4pie0

+0

Я просто пытаюсь получить ответ. Пожалуйста, не заботьтесь о моих функциях printf. Вопрос не в этом. –

ответ

1

Таким образом, префикс представляет собой указатель типа char. В этих терминах prefix + 1 является ссылкой на следующую страницу char в массиве, не так ли?

Нет и да. prefix не является указателем на char, это массив из NPREF указателей на char. Размер этого массива

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 
Смежные вопросы