Путаница с ссылками на элементы в массиве указателей - PullRequest
0 голосов
/ 29 октября 2018

У меня небольшие затруднения с пониманием того, как этот код выводит 10. Я понимаю, что p - это адрес первого элемента в массиве указателей, то есть p + 1 - это адрес второго элемента списка. Значение * (p + 1) - это адрес первого элемента массива n. Следовательно, * (* (p + 1) + 1) вычисляется для 2-го элемента массива n. Тем не менее, я запутался в том, как приведенный ниже код печатает значение 10, означающее первый элемент массива r. Помощь очень ценится.

int m[4]={-2,3,6,8,9}, n[4]={7,6,4,3}, r[4]={10,-3,5};
int *p[3]={m,n,r};
printf("%d", *((p+1)[1]));

Ответы [ 2 ]

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

У вас есть массив указателей, поэтому p - это указатель на -2 (начало массива m ), а p + 1 - указатель до 7 (начало массива n ).

То есть p - указатель на начало массива, который содержит 3 указателя, а p + 1 - указатель на начало массива, который содержит 2 указателя, и когда вы напишите (p + 1) [1] , вы получите тот же результат, что и p [2] .

*p[2] == *(p+1)[1] == *(p+2)
0 голосов
/ 29 октября 2018

Начиная с p:

  • p: {m, n, r}
  • p+1: {n, r}
  • (p+1): {n, r}
  • (p+1)[1]: r
  • ((p+1)[1]): r
  • ((p+1)[1]): {10, -3, 5}
  • *((p+1)[1]): 10

Обратите внимание, что (p+1)[1] означает *((p+1)+1), а не (*(p+1))+1.

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