Вы передаете адреса a и b функции подкачки, которая имеет два указателя, теперь указывающих на a и b. Значение a хранится в int t. значение b сохраняется затем в a, а значение, которое было сохранено в a (теперь в t), устанавливается на b.
Как только функция завершает работу, значения меняются местами, поэтому происходит изменение в main.
Если вы передадите действительные значения a и b вместо обмена, то адреса, которые вы не заметите, вернутся в main. Это сила указателей и установка адреса переменной на указатель.
Указатель теперь может изменять значение переменной, поскольку он имеет свой адрес. Думайте об этом, как о том, чтобы дать ключ от дома своему соседу. Теперь ваш сосед может войти в ваш дом и изменить расположение чего-либо в вашем доме, поскольку у него есть ключ (адрес переменной). Без ключа сосед не может попасть в ваш дом (пример передачи по значению), а без ключа не может устроить дом.
Нарисуйте картинки, которые они обычно помогают. Вот потрясающее объяснение, данное на stackoverflow:
Каковы барьеры для понимания указателей и что можно сделать, чтобы их преодолеть?
Пример, приведенный в ссылке, не относится непосредственно к C / C ++, но может применяться к любому языку, который может поддерживать изменение значений с помощью указателей / адресов.