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

Почему разница между двумя адресами неверна? 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.

Interesting Posts

Android LinearLayout с цветовым ресурсом: что я делаю неправильно?

Метеор: Как я могу узнать, когда firebase database готова?

Как вы проверяете, играет ли музыка с помощью широковещательного приемника?

Ящик для навигации: как установить выбранный элемент при запуске?

Как использовать меню (ссылки на стиль веб-сайта) в приложении для Java-приложений

java.lang.NoClassDefFoundError: org / apache / spark / Logging

Почему разработчику WPF не удается загрузить библиотеки, вызывающие неуправляемые библиотеки DLL?

Пользовательская панель прогресса в Android?

Возможно ли в java сделать что-то вроде Comparator, но для реализации пользовательских equals () и hashCode ()

Удаление пароля BIOS на ноутбуке Dell

Зачем нужен метод main () в основном classе java

Должен ли я использовать getApplicationContext или Activity.это в долгосрочной перспективе AsyncTask

Сбой Skype сразу после запуска

Как я могу сравнить содержимое двух (или более) файлов MSI?

Java ищет метод с конкретной аннотацией и элементом annotations

Давайте будем гением компьютера.