Вопрос 1: параметры указателя в функциях получают копию указателя или получают непосредственно указатель?
Различие, которое пытается задать этот вопрос, предполагает определенное отсутствие понимания фона.
Думайте о указателе как о номере / адресе, который можно использовать для доступа к некоторым другим данным. Копия этого адреса просто копирует номер. 42 - это то же самое, что и «копия 42»? Да, в некотором смысле.
x := &value // x holds the address of value now
y := x // and now y does, too
Учитывая две вышеупомянутые строки, присвоение x
чему-либо другому абсолютно ничего не меняет value
или &value
. Он просто переназначает x
на другой адрес. Однако, если сделать что-то вроде *x = 999
, то изменится value
, потому что x
содержит адрес value
, а перенаправление *x
означает доступ к value
.
Если это не 100% ясно, попробуйте пройти через Тур по Go, начиная здесь .
Вопрос 2: почему значение x в двойной функции такое же, как & a в основной игре c ?
Из-за объяснения выше. &a
- это адрес a
- это число, подумайте еще раз 42 (реальный адрес - что-то вроде 0x40e020, но давайте для простоты назовем его 42). Когда вы передаете его в функцию, принимающую *int
, 42 копируется, а x
в double
становится 42. Теперь оба x
внутри double
и &a
снаружи имеют адрес a
в их.
Вопрос 3: если x имеет то же значение, что и & a, то почему, когда x = nil & стиль имеет значение, а не nil?
Поскольку x
просто имеет значение 42, которое является адресом a
. Если вы назначите что-либо еще для x
, это не изменит адрес , не так ли? Это меняет x
. x
больше не будет указывать на a
.