Разница указателей / адресов

Почему разница между двумя адресами неверна? http://codepad.org/NGDqFWjJ

#include int main() { int i = 10, j = 20; int *p = &i; int *q = &j; int c = p - q; printf("%d\n", p); printf("%d\n", q); printf("%d", c); return 0; } 

Вывод:

 -1083846364 -1083846368 1 

Во-первых, арифметика указателя не определяется, когда выполняется на несвязанных указателях.

Во-вторых, это имеет смысл. При вычитании указателей вы получаете количество элементов между этими адресами, а не количество байтов.

Если бы вы попытались

 char *p1 = &i, *p2 = &j; 

вы получите другой результат.


В качестве дополнительной заметки используйте %p при печати указателей.

Как говорили другие, результат, который вы получаете, находится в кратном размере того типа, на который указывают указатели. Нарисуйте их как указатели на символы, и полученный результат будет в байтах. Кроме того, вы должны использовать тип ptrdiff_t , так что на системах с 64-разрядными указателями тип должен быть достаточно большим, чтобы удерживать результат.

 ptrdiff_t c = (char*)p - (char*)q; 

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

Строго говоря, ваша программа вызывает несколько видов неопределенного поведения, сначала из-за арифметики указателя на несвязанных указателях, а затем с несогласованными строками и аргументами формата в ваших операторах печати. Однако, даже если они были исправлены, вы увидите те же результаты. Причина, по которой разница равна 1, состоит в том, что арифметика указателя дает результаты в единицах размера указанного типа – в вашем случае int является 4-байтовым типом, поэтому вычитание указателей int * разделяющих точку 4 байта, дает результат 1.

  • Зачем использовать указатели?
  • постоянный указатель vs указатель на постоянное значение
  • Почему cout печатает массивы char по-разному от других массивов?
  • Как происходит разыменование функционального указателя?
  • В C, какой правильный синтаксис для объявления указателей?
  • Создать указатель на двумерный массив
  • C ++ Доступный элемент classа из указателя базового classа
  • Объявление указателя на multidimensional array и выделение массива
  • Скрытие нулевых значений, понимание того, почему голанг не удается здесь
  • Строки C ++: vs. *
  • Длина массива в аргументе функции
  • Давайте будем гением компьютера.