Почему вывод этого кода равен 2 вместо 8?

#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;
}
 

Одни и те же адреса, но разные типы указателей, поэтому результат разный.