Застрял с синтаксисом в c - указатели - PullRequest
2 голосов
/ 21 февраля 2010

хорошо, так что если у нас есть char *hello - и строка будет "hello"

и я делаю

char *ptr ;
ptr = hello;

тогда ptr будет указывать на 'h', правильно?

Теперь я только что сделал в нем assignmnet и выполнил его, используя следующие термины

если бы я хотел переместить указатель на следующий чат, я бы просто сделал ptr++. Если бы я хотел использовать значение указателя для какой-либо проверки, я бы использовал if(*ptr == '\0')...

Когда я выполнял поручение, наш учитель дал нам несколько готовых методов, и они использовали такие вещи, как

*string++ = *s++;

хорошо, так почему мы хотим сделать *string (который получает значение) - и объединить его с ++

Надеюсь, я объясню, что не ясно. Просто мне удалось не делать весь assignmnet с помощью ptr ++ для перехода к следующему элементу или * ptr для проверки его значения

спасибо

Ответы [ 6 ]

5 голосов
/ 21 февраля 2010

Идиома *s++ означает «принять указанное значение и переключиться на следующее».Таким образом, вы можете выполнять свои операции проверки в цикле.Назначение *p++ = *q++ копирует значение *q в место, указанное p, и сдвигает p и q на следующее место, поэтому при следующем выполнении *p++ = *q++ следующий символскопировано за первым.И так далее.

4 голосов
/ 21 февраля 2010

Не совсем. В исходном вопросе ptr будет указывать на тот же первый символ, что и hello, что может не обязательно быть h. Возможно, вы сделали:

char *hello = "goodbye";

, и в этом случае hello и ptr будут указывать на это g. Однако ваше редактирование теперь дает понять, что вы имели в виду:

char *hello = "hello";

Ваш комментарий к ptr++ правильный. Он будет перемещен ptr так, чтобы он указывал на следующий символ, и, в соответствии с соглашением об обработке строки C, '\0' отмечает конец строки.

Утверждение:

*string++ = *s++;

это то, что вы часто видите в коде копирования строк (копирование s в string), что-то вроде:

char *mystrcpy (char *d, char *s) {
    char *d2 = d;
    while (*s != '\0')
        *d2++ = *s++;
    *d2 = '\0';
    return d;
}

В этом случае строка *d2++ = *s++; означает:

  • скопировать символ в s в ячейку памяти d2.
  • увеличение d2 для указания следующего целевого символа.
  • увеличение s для указания следующего исходного символа.

Другими словами,

*string++ = *s++;

функционально идентичен:

*string = *s;
string++;
s++;
1 голос
/ 21 февраля 2010

так почему мы хотим сделать * строку (которая получает значение) - и объединить ее с ++

Когда *string находится слева от равенства, оно не получает значение, оно устанавливает значение.

Заявление *string++ = *s++; эквивалентно:

*string = *s;
s++;
string++;

Это потому, что x++ - это оператор приращения постфикса (в отличие от ++x, который является оператором приращения префикса). Указатель x обновляется, но в выражении используется значение, на которое изначально указывал x.

Лично я бы сказал, что однострочное чтение более запутанно, и вам следует избегать сложных выражений с побочными эффектами. Но в этом случае это довольно стандартная идиома в C, так что вы можете с этим привыкнуть.

0 голосов
/ 21 февраля 2010

Просто быстрое дополнение к ответу Марка Байерса, который правильно указывает на приращение постфикса («a ++»), а не приращение префикса («++ a»).

Возможно, вы захотите взглянуть на приоритет оператора C для порядка, в котором операторы обрабатываются в выражении.

Вы всегда можете принудительно установить приоритет, используя круглые скобки: (a + b) * c! = A + b * c.

0 голосов
/ 21 февраля 2010

тогда ptr будет указывать на h, верно?

Да, правильно.

хорошо, так почему мы хотим сделать * строку (которая получает значение)

«*» не обязательно получает значение: оно может устанавливать значение в зависимости от того, с какой стороны знака «=» оно есть.

char *ptr;
ptr = "hello";
char firstLetter = *ptr; //get the value: now firstLetter contains 'h'
*ptr = 'w'; //set the value: now ptr is pointing to "wello".

Объединение * с ++ означает, что вы делаете одно за другим:

  • Справа «* s ++» означает «получить значение, на которое указывает s, а затем увеличить указатель s».
  • С левой стороны '* string ++' означает "установить значение, на которое указывает строка, а затем увеличить указатель строки".

Объединение их в одно утверждение просто более короткий, более компактный (но функционально эквивалентный) способ записи:

*string = *s;
string++;
s++;
0 голосов
/ 21 февраля 2010

тогда ptr будет указывать на h, верно?

Да. Нет. См. @ paxdiablo ответ .

*string++ = *s++;

Это утверждение можно рассматривать как

*string = *s;
string ++;
s ++;

Это значит:

  1. Скопируйте символ в s в место, указанное string.
  2. Перемещение s и string к следующему символу.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...