Не понятна работа кода
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 указывает сюда