Не понятна работа кода

int main(void)
{

    int buff[5] = { 1, 2, 3, 4, 5 };

    int* p = &buff[0];


    //вариант 1
    //вывод 2-1-1
    p++;
    
    std::cout << *p << std::endl;

    p[0] = p[-1];

    std::cout << p[0] << std::endl;

    std::cout << *p << std::endl;

    //вариант 2
    //вывод 3-1-1
    p++;

    std::cout << *p << std::endl;

    p[0] = p[-1];

    std::cout << p[0] << std::endl;

    std::cout << *p << std::endl;

    //вариант 3
    //вывод 4-1-1
    p++;

    std::cout << *p << std::endl;

    p[0] = p[-1];

    std::cout << p[0] << std::endl;

    std::cout << *p << std::endl;

    return 0;
}

Вывод этого кода

2 1 1 3 1 1 4 1 1

Кто может объяснить почему?

Например в конце 2го варианта печатает 1:

std::cout << *p << std::endl;

И тут мы переходим к 3му варианту сразу после этого и увеличиваем ++ на 1 и печатает 4 после 1:

//вариант 3
    //вывод 4-1-1
    p++;

    std::cout << *p << std::endl;

То есть в *p было равно 1 мы делаем ++ инкремент и сразу *p становиться равно 4.

Почему так?


Ответы (1 шт):

Автор решения: CrazyElf

Пояснил для первого куска, дальше всё аналогично.
*p и p[0] - это одно и то же по сути.

    int buff[5] = { 1, 2, 3, 4, 5 };
    //              ^ p указывает сюда
    int* p = &buff[0]; // p указывает на 1

    p++; // p теперь указывает на 2
    std::cout << *p << std::endl; // печатаем 2
    p[0] = p[-1]; // вместо 2 теперь будет предыдущий элемент, т.е. 1
    // т.е. в buff теперь { 1, 1, 3, 4, 5 };
    //                         ^ p указывает сюда
    std::cout << p[0] << std::endl; // печатаем 1
    std::cout << *p << std::endl; // печатаем 1

Дальше всё происходит аналогично - p увеличивается на 1 и указывает на следующий элемент buff, а потом в этот элемент копируется предыдущий элемент, т.е. 1.

...
    // т.е. в buff теперь { 1, 1, 1, 4, 5 };
    //                            ^ p указывает сюда
...
    // т.е. в buff теперь { 1, 1, 1, 1, 5 };
    //                               ^ p указывает сюда
→ Ссылка