Оба раза будет напечатано 5. В modifyPointer передаётся копия адреса, и присваивание p=&v изменяет только локальную переменную p.
Влияние переназначения указателя внутри функции на внешний указатель
Оба раза будет напечатано 5. В modifyPointer передаётся копия адреса, и присваивание p=&v изменяет только локальную переменную p.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно определить, какой вывод получит программа и понять, изменяется ли ссылка, переданная в функцию, на объект, находящийся за её пределами.
package main
import "fmt"
func modifyPointer(p *int) {
v := 3
p = &v
}
func main() {
x := 5
ptr := &x
fmt.Println(*ptr)
modifyPointer(ptr)
fmt.Println(*ptr)
}
Ответ
Оба раза будет напечатано 5. В modifyPointer передаётся копия адреса, и присваивание p=&v изменяет только локальную переменную p.
Исходный ptr продолжает указывать на x. Для изменения самого x нужно записать через указатель, например *p=3. Для переназначения ptr можно вернуть новый указатель и присвоить его у вызывающего либо передать **int. Возврат адреса локальной переменной в Go допустим: компилятор обеспечивает нужное время жизни объекта.