Преобразование C в Java - запрос указателя - PullRequest
2 голосов
/ 13 октября 2011

Я конвертирую прогу C, которая анализирует текстовую строку и производит удобочитаемое о / п.

Понятно, но проблема с пониманием разницы в

*char_ptr++   

и
char_ptr-- в

 token[i++] = c = toupper(*char_ptr++);
 if (c == '\0')
   {
     char_ptr--;
     return( 0 );
   }

Правильно ли я считаю, что *char_ptr++ будет эффективно указывать на следующий символ в «строке»? Если да, то что делает char_ptr--? 1013 *

Спасибо.

Ответы [ 5 ]

3 голосов
/ 13 октября 2011

Считайте *char_ptr++ как:

char tmp = *char_ptr;
char_ptr++;
c = toupper(tmp);

Таким образом, он эффективно выбирает текущий символ и перемещает указатель на единицу. Поскольку оператор ++ имеет более высокий приоритет, чем унарный *, такое выражение оценивается в порядке *(char_ptr++).

Сначала применяется приращение, но поскольку оператор постфикса ++ возвращает результат до манипуляции, оператор разыменования * применяется к старому адресу.

char_ptr-- просто уменьшает указатель на единицу.

1 голос
/ 13 октября 2011

Поскольку вы конвертируете в Java, вам придется удалить указатели, Java не поддерживает их.

token[i++] = c = toupper(*char_ptr++);
if (c == '\0')
{
    char_ptr--;
    return( 0 );
}

Скорее всего, над ним было какое-то объявление, говорящее:

char* char_ptr = some_array;

Вместо этого это будет

int pos = 0;

И приведенный выше код становится:

token[i++] = c = toupper(some_array[pos++]);
if (c == '\0')
{
    pos--;
    return( 0 );
}
1 голос
/ 13 октября 2011

Аналогично ++ увеличивает указатель и указывает на следующий символ, -- уменьшает его, указывая на предыдущий символ. В этом случае он возвращает его к последнему действительному символу из завершающего нуля.

0 голосов
/ 13 октября 2011

Этот вопрос решается по правилам предшествования.Выражение

*char_ptr++

разрешается в

*(char_ptr++)

, что означает «символ после символа, на который указывает ptr».Поэтому, когда c равно '\ 0' (ноль), указатель уменьшается, поэтому он указывает на предыдущий символ.Он практически уменьшается до предыдущего символа всякий раз, когда встречается 0, так что char_ptr указывает на то, на что он указывал во время последнего запуска блока.

0 голосов
/ 13 октября 2011

Да, вы правы. Это способ «заглянуть» вперед в «строку», а затем вернуться туда, где вы были, если строка была в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...