>  기사  >  백엔드 개발  >  함수 인수로 전달된 포인터가 수정되고 있는지, 아니면 복사본이 수정되고 있는지 확인하는 방법은 무엇입니까?

함수 인수로 전달된 포인터가 수정되고 있는지, 아니면 복사본이 수정되고 있는지 확인하는 방법은 무엇입니까?

WBOY
WBOY앞으로
2024-02-06 10:15:11990검색

함수 인수로 전달된 포인터가 수정되고 있는지, 아니면 복사본이 수정되고 있는지 확인하는 방법은 무엇입니까?

질문 내용

package main

import (
    "fmt"
)

type Numbers struct {
    x int
    y int
}

func initial(number *Numbers) {
    number.x = 1
    number.y = 1
}

func final(number *Numbers) {
    number = &Numbers{2, 2}
}

func main() {
    p := Numbers{0, 0}
    fmt.Println(p) //Prints {0 0}

    initial(&p)
    fmt.Println(p) //Prints {1 1}

    final(&p)
    fmt.Println(p) //Expected to print {2, 2} but prints {1, 1}
}

initial 函数修改指针,而 final 함수가 포인터 복사본을 수정하나요?

initialfinal的函数参数都指向pmain中的内存地址; initial 能够更改 p,而 final 안돼요.

이런 일이 발생하는 이유에 대한 설명을 주시면 매우 감사하겠습니다.


정답


포인터가 가리키는 데이터를 수정하려면 포인터를 역참조해야 합니다. 역참조 연산자는 *。然而,为了方便使用,Go 在某些情况下会隐式插入解引用操作。例如,number.x = 1 被转换为 (*number).x = 1입니다.

이 암시적 번역은 혼란스러울 수 있지만 번역이 발생하지 않으면 number.x = 1 将毫无意义,因为 number 표현식은 포인터 유형이고 포인터에는 필드가 없다는 것을 알아야 합니다.

요약하자면, initial 函数具有隐式指针解引用,而 final 그렇지 않습니다.

원하신다면 final 更改为显式且正确地取消引用,*number = Numbers{2, 2},那么它也会更改 p.

위 내용은 함수 인수로 전달된 포인터가 수정되고 있는지, 아니면 복사본이 수정되고 있는지 확인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제