Указатель в параметре fun c: копирование по значению или по указателю - PullRequest
0 голосов
/ 04 апреля 2020

вот код:

package main

import "fmt"

func double(x *int) {
    fmt.Printf("pointer of pointer #1: %p\n", &x)
    fmt.Printf("pointer#1 : %p\n", x)

    *x += *x
    x = nil
    fmt.Printf("pointer#2 : %p\n", x)
    fmt.Printf("pointer of pointer #2: %p\n", &x)

}

func main() {
    var a = 3
    double(&a)
    fmt.Println(a) // 6
    fmt.Printf("pointer a in main: %p\n", &a)

    p := &a
    double(p)
    fmt.Println(a, p == nil) // 12 false
    fmt.Printf("pointer p in main: %p\n", p)
    fmt.Printf("pointer of pointer p in main: %p\n", &p)

}

или детская площадка .

Вопрос 1: параметры указателя в функциях получают копию указателя или получают непосредственно указатель?

Вопрос 2: почему значение x в double является функцией так же, как & a в main fun c?

Вопрос 3: если x имеет то же значение, что и & a тогда почему, когда x = ноль & стиль имеет значение, а не ноль?

1 Ответ

2 голосов
/ 04 апреля 2020

Вопрос 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...