разница в приращении указателя с ** и без в C - PullRequest
0 голосов
/ 09 октября 2018

У меня проблема с пониманием различий в этих двух способах увеличения указателей:

int **a;

a++;      //works fine
**a++;    //same here
a += n;   //still good
**a += n; //is not the same and I can't figure out what is going on

Я пытался напечатать параметры программы в обратном порядке здесь

int main(int argc, char **argv)
{
    argv += argc;                 //works fine until it is changed to 
                                  //                   **argv += argc
    while (--argc > 0)
    {
        argv--;
        (*argv)--;
        while (*(*argv)++)
            ft_putchar(**argv);
        if (argc - 1 > 0)
            ft_putchar('\n');
    }
    return (1);
}

Подводя вопрос - почему второй способ не работает так же?

1 Ответ

0 голосов
/ 09 октября 2018

Я думаю, что вас смущает:

**a++ анализируется как **(a++), а
**a += n анализируется как (**a) += n

Это связано с приоритет оператора

Мой совет - всегда использовать круглые скобки в подобных случаях, чтобы избежать путаницы.

Теперь перейдем к каждому случаю:

Случай 1

a++

Арифметика указателей.Пост-приращения a

Случай 2

**a++

анализируется как **(a++)

  • это отправка приращений a - Арифметика указателей
  • результат вычисления (a++) равен a - значение до приращения
  • , тогда у вас есть двойное косвенное указание.

Таким образом, приведенное выше эквивалентно (больше илименьше) со следующим:

**a;
a = a + 1;

Случай 3

a += n

Арифметика указателя.Я ожидал бы самоочевидного.

Случай 4

**a += n

Это анализируется как

(**a) += n

Таким образом, вы делаете двойное перенаправление на a, получая значениеуказанного целого числа, а затем вы увеличиваете это целое число (целочисленная арифметика).

...