В повторяющемся вопросе упоминается, что:
вычитание указателя дает количество элементов массива между двумя указателями одного типа
Подробнее об этом читайте в путанице с вычитанием указателя.
Однако ваш код неверен и имеет неправильный формат, поскольку вызывает неопределенное поведение. Пожалуйста, скомпилируйте с включенными предупреждениями, и вы получите:
main.c: In function ‘main’:
main.c:12:7: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
p = arr[1];
^
main.c:13:7: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
q = arr[3];
^
main.c:15:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long int’ [-Wformat=]
printf("P-Q: %d, P: %d, Q: %d", (p - q), p, q);
^
main.c:15:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘int *’ [-Wformat=]
main.c:15:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 4 has type ‘int *’ [-Wformat=]
Ошибки все равно будут. Для предупреждений я просто использовал флаг -Wall
.
Чтобы ваш код имел смысл, вы можете просто объявить p
и q
как простые int
, а не как указатели.
Или вы можете сделать это:
p = &arr[1];
q = &arr[3];
printf("P-Q: %td, P: %p, Q: %p", (p - q), (void *)p, (void *)q);
и получить что-то вроде этого:
P-Q: -2, P: 0x7ffdd37594d4, Q: 0x7ffdd37594dc
Обратите внимание, что я использовал %td
для печати результата вычитания указателей.
person
gsamaras
schedule
27.06.2018
p = arr[1];
и так поведение, определяемое реализацией. - person Sourav Ghosh   schedule 27.06.2018int *p, *q;
вместоint p, q;
? Тогда вам следует подробнее объяснить свои мысли. - person Yunnosch   schedule 27.06.2018q
содержит 2, аp
содержит 4. Как указано в дубликате: вычитание указателя дает количество элементов массива между двумя указателями одного типа. Предполагая, чтоsizeof int
равно 4 на вашей платформе, разница между указателем 4 и 2 меньше, чемsizeof int
, поэтому вычитание на самом деле не имеет смысла. - person Jabberwocky   schedule 27.06.2018%p
и их различия, такие какp - q
, должны быть напечатаны с%td
. У тебя там много UB - person phuclv   schedule 27.06.2018%td
для разницы указателей? Я думал, что%ld
будет достаточно, поскольку предупреждение предполагает это (проверьте мой ответ и давайте улучшим его, если это необходимо). - person gsamaras   schedule 27.06.2018ptrdiff_t
) - person phuclv   schedule 27.06.2018%d
неправильно. Но в качестве исправления я предложил%ld
, вместоlong int
. Интересно, ваше исправление лучше моего @phuclv. - person gsamaras   schedule 27.06.2018ptrdiff_t
не обязательноlong int
- person phuclv   schedule 27.06.2018