Разница указателей / адресов
Почему разница между двумя адресами неверна? 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
- Проходит ли указатель указателя, передается по значению в C ++?
- Арифметика указателей
- Что происходит в ОС, когда мы разыскиваем указатель NULL в C?
- Почему массивы в C распадаются на указатели?
- Какова реальная разница между указателями и ссылками?
- Использование fseek с указателем файла, указывающим на stdin
- Что такое «->» в Objective C?
- C ++ Можно ли определить, указывает ли указатель на действительный объект?
- Преобразование из производного ** в базу **
- Является ли NULL всегда ложным?
- Массивы - это указатели?
- Разница между char * var; и char * var ;?
- Нарезка указателя среза, переданного в качестве аргумента
Во-первых, арифметика указателя не определяется, когда выполняется на несвязанных указателях.
Во-вторых, это имеет смысл. При вычитании указателей вы получаете количество элементов между этими адресами, а не количество байтов.
Если бы вы попытались
char *p1 = &i, *p2 = &j;
вы получите другой результат.
В качестве дополнительной заметки используйте %p
при печати указателей.
Как говорили другие, результат, который вы получаете, находится в кратном размере того типа, на который указывают указатели. Нарисуйте их как указатели на символы, и полученный результат будет в байтах. Кроме того, вы должны использовать тип ptrdiff_t , так что на системах с 64-разрядными указателями тип должен быть достаточно большим, чтобы удерживать результат.
ptrdiff_t c = (char*)p - (char*)q;
Также обратите внимание, что разница между адресами двух значений, которые не находятся в одном массиве, в стандарте не определена, но работает над каждой системой.
Строго говоря, ваша программа вызывает несколько видов неопределенного поведения, сначала из-за арифметики указателя на несвязанных указателях, а затем с несогласованными строками и аргументами формата в ваших операторах печати. Однако, даже если они были исправлены, вы увидите те же результаты. Причина, по которой разница равна 1, состоит в том, что арифметика указателя дает результаты в единицах размера указанного типа – в вашем случае int
является 4-байтовым типом, поэтому вычитание указателей int *
разделяющих точку 4 байта, дает результат 1.