Я пытаюсь использовать литературу C-указателя. На одной из иллюстраций я обнаружил следующий код.
# include <stdio.h>
int main()
{
static int a[]={0,1,2,3,4};
static int *p[]={a, a+1, a+2, a+3, a+4};
int **ptr;
ptr =p;
**ptr++;
printf("%d %d %d\n", ptr-p, *ptr-a, **ptr);
*++*ptr;
printf("%d %d %d\n", ptr-p, *ptr-a, **ptr);
++**ptr;
printf("%d %d %d\n", ptr-p, *ptr-a, **ptr);
return 0;
}
Я получаю вывод как.
1 1 1
1 2 2
1 2 3
У меня возникает проблема в оправдании этого вывода. Я сделал много коробок на копии, чтобы легко понять проблему. Я могу оправдать вывод 1 1 1
, моя проблема начинается с утверждения, *++*ptr
.
Так как унарные операторы выполняются справа налево. Таким образом, сначала будет решаться *ptr
, тогда значение в ptr
будет увеличиваться.
После этого прироста я не уверен, что происходит, в книге говорится, что как-то p
также увеличивается, чтобы указывать на следующий элемент в этом массиве. Выход 1 2 2
может быть достигнут только с помощью приращения p
.
Я не уверен, что этот вопрос подходит именно к stackoverflow.
Я старался изо всех сил, растратил по крайней мере 10 страниц с надписями над ними.
Любые разъяснения будут оценены.