#arrays #c #memory #printing
#массивы #c #память #печать
Вопрос:
int main()
{
int array[5];
int *p,*q;
p =amp;array[1];
q=amp;array[3];
printf("%dn",q);
printf("%dn",p);
printf("%d",q-p);
return 0;
}
Память p
и q
тоже распечатывается, но почему разница 2 вместо 8?
Комментарии:
1. Пожалуйста, не размещайте изображения текста, размещайте текст напрямую.
2. Вычитание указателей — это то же самое, что и вычитание индексов .
3-1=2
.
Ответ №1:
Вы вызываете арифметику указателей. Когда у вас есть два указателя на элементы в одном и том же массиве, вычитание этих указателей дает вам разницу в байтах между адресами, деленную на размер байта разыменованного типа указателя. Итак, результатом вычитания двух указателей является количество элементов между их адресами, а не количество байтов, как вы ожидаете.
Итак, в вашем случае вы вычитаете int*
указатели, и sizeof(int)
в вашем компиляторе явно 4 байта, так что между адресами и есть 8 байт amp;array[1]
amp;array[3]
, что составляет 2 int
элемента между array[1]
и array[3]
.
---------------------
| 0 | 1 | 2 | 3 | 4 |
---------------------
^ ^
p q
p = 0xBE460A94
q = 0xBE460A9C
Попробуйте это вместо, и вы увидите 8 вместо:
int main()
{
int array[5];
char *p, *q;
p = (char*) amp;array[1];
q = (char*) amp;array[3];
printf("%pn", q);
printf("%pn", p);
printf("%d", q - p);
return 0;
}
Одни и те же адреса, но разные типы указателей, поэтому результат разный.