Влияние переназначения указателя внутри функции на внешний указатель

Оба раза будет напечатано 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 допустим: компилятор обеспечивает нужное время жизни объекта.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее