Я не эксперт по STL, но я считаю, что причина, по которой он не компилируется, заключается в том, что итератор - это объект, который указывает на другой объект. Другими словами, итератор является обобщением указателя. Таким образом, чтобы сделать то, что вам нужно, с минимальными изменениями в вашем коде, вам сначала нужно отменить ссылку на итератор, чтобы получить значение, которое он содержит. Затем вы использовали бы '&', чтобы получить его адрес, а затем присвоили бы этот адрес переменной указателя. Вот почему ptr = & * it; работает.