go언어 포인터

왱구·2024년 4월 11일

go

목록 보기
3/7

1. 포인터란?


: 값의 메모리 주소를 저장하는 변수

2. go에서의 포인터?


C와 C++에서는 포인터로 포인터 연산을 통해 메모리 주소를 직접 제어할 수 있다.
하지만 go에서는 포인터 변수를 제공은 하지만 연산까지는 허용하지 않고
단순히 특정 변수나 특정 오브젝트를 주소값으로 참조할 수 있는 주소값 형태의 포인터 변수를 제공한다.

자바, 파이썬, C# 같은 언어에서는 포인터를 사용하지 않고 객체를 참조하는 방식으로 메모리에 간접 접근한다.
하지만 직접적으로 포인터 변수를 제공하지 않을 뿐이지 실제로는 언어에서 포인터를 이용하여 자동으로 관리하고있다.

3. go에서의 포인터 정리


  • 변수앞에 &를 붙이면 해당 변수는 메모리 주소를 가지며 이를 포인터 라고 부른다.
  • 포인터에 * 연산자를 사용하면 해당 주소의 실제 값을 참조한다. 이를 역참조 또는 간접참조 라고 부른다.
  • go에서는 메모리 주소를 직접 대입하거나 포인터 연산을 허용하지 않는다.

1) 예제

import "fmt"

func main() {
    // &는 실제 값의 주소값
    i := 10
    p := &i
    
    // *은 주소값이 가리키는 값
    fmt.Println(i)    // 10
    fmt.Println(p)    // 0xc0000b4010
    fmt.Println(*p)   // 10
    
    
    // p가 지닌건 주소값이지만 p에서 값을 변경하게되면 i도 바뀐다
    // p가 주소값을 통해 참조하고있는 값 i가 바뀌게된다
    *p = 12
    
    fmt.Println(*p)   // 12
    fmt.Println(i)    // 12
}

2) 함수 호출 과정

함수를 호출할 때는 주소값 전달을 위해 "함수명(&변수명)"을 입력한다
함수에서 매개변수명을 입력할 때 값을 참조하기 위해 *을 매개변수형 앞에 붙인다
함수안에서 모든 매개변수 앞에 *를 붙여야한다.

profile
늦깎이 애아빠 개발지망생

0개의 댓글