Почему * (ptr ++) не дает следующий элемент в массиве? - PullRequest
0 голосов
/ 09 февраля 2011
int my_array[] = {1,23,17,4,-5,100};
int *ptr;
int i;
ptr = &my_array[0];     /* point our pointer to the first
                         element of the array */
printf("\n\nptr = %d\n\n", *ptr);
for (i = 0; i < 6; i++)
{
    printf("my_array[%d] = %d   ",i,my_array[i]);   /*<-- A */
    printf("my_array[%d] = %d\n",i, *(ptr++));        /*<-- B */
}

Почему это отображает одно и то же для строк a и b?Он просто отображает все значения в my_array в порядке (1, 23, 17, 4, -5, 100).Почему '++' в строке B не указывает ptr на следующий элемент массива до его разыменования?Даже если вы измените эту строку на

printf("ptr + %d = %d\n",i, *ptr++);        /*<-- B */

, вывод останется прежним.Почему это?

Ответы [ 6 ]

13 голосов
/ 09 февраля 2011

ptr ++ увеличивает ptr, но возвращает исходное значение
++ ptr увеличивает и возвращает новое значение

Отсюда и шутка насчет c ++ - это на один больше, чем c, но вы используете оригинальное значение = c

2 голосов
/ 09 февраля 2011

Кажется, вы озадачены тем фактом, что скобки не изменяют возвращаемое значение так, как вы ожидали.

Возможно, вам будет понятнее, если вы подумаете по-английски:

p ++ означает, что принимает значение p, увеличивает значение p, возвращает начальное значение p

, поэтому *p++ разыменовывает исходное значение p.

Учитывая, что значение (x) совпадает с x, значение (p++) совпадает с p++.

Следовательно, *(p++) будет разыменовываться p,точно так же, как *p++.

1 голос
/ 09 февраля 2011

Это видно из именования пост-инкремента и предварительного инкремента. Это означает, что переменная увеличивается после операции или перед операцией.

Оператор постинкремента создает временную переменную для хранения текущего значения и увеличивает ее (но возвращает временную переменную с текущим значением). В прединкрементном операторе нет временной переменной. Эта же переменная увеличивается и возвращается.

То есть использование оператора постинкремента в одном и том же операторе означает использование текущего значения переменной и увеличение после этого оператора. Принимая во внимание, что постинкрементный оператор означает увеличение переменной и использование ее в текущем операторе.

1 голос
/ 09 февраля 2011

В C есть разница между постинкрементным p ++ и преинкрементным ++ p

p ++: использует текущее значение p, а затем обновляет его ++ P: обновляет значение p и затем использует его

следовательно, ваш код должен использовать ++ ptr

0 голосов
/ 09 февраля 2011

Чтобы избежать этой проблемы, напишите одну из следующих альтернатив:

++ptr;
printf("my_array[%d] = %d\n",i, *ptr);

или

printf("my_array[%d] = %d\n",i, *ptr);
++ptr;

Это даст такое же количество инструкций, но со следующими основными преимуществами:

  • Теперь более читабельно и понятно.
  • Если ptr будет использоваться несколько раз в выражении printf (), вам не нужно беспокоиться о порядке вычисления параметров функции или операндов, которые не определены в языке C (за редким исключением). Если бы вы написали printf("%d %d", *++ptr, *++ptr);, вы не можете знать результат, так как тогда код будет зависеть от порядка оценки, то есть он может содержать серьезную ошибку.
0 голосов
/ 09 февраля 2011

Существует 2 типа операторов: Postfix и Prefix. * ptr ++ - постфиксный оператор означает сначала использовать, а затем увеличить в то время как ++ ptr означает префиксный оператор означает сначала увеличение, а затем использование.

если вы добавите еще один printf с печатью значения * ptr в существующем коде, вы заметите разницу в том, как идут дела.

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