Разница в арифметике указателей (& x [5] -x) - PullRequest
0 голосов
/ 20 января 2019

У меня есть следующий фрагмент:

int main(){
    int x[5]={1,2,3,4,5};
    printf("\n%d\n", &x[2]-x);
}

Я знаю, что в арифметике указателей &x[5]-&x[2] дает, например, 3, потому что вычитание возвращает разницу в типе указателя между двумя указателями.Но я не могу понять, как машина обрабатывает &x[2]-x, поскольку она выдает 2.

1 Ответ

0 голосов
/ 20 января 2019

Проще говоря, x, являющийся lvalue для массива типа int [5], означает, что он может неявно затухать до указателя на первый элемент при использовании в таком выражении, поэтому в некотором смысле код выполняет ту же функцию как &x[2] - &x[0] будет.

Вы можете узнать больше о распаде указателя массива здесь . Обратите внимание, что это также, например, то, как, например, оператор нижнего индекса работает, поскольку его определение a[b] идентично *(a + b), в этом случае a будет распадаться на указатель на первый элемент и через арифметику указателей с b end указывающий на нужный элемент, на который нужно разыменовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...