프로그래밍/Go

[golang] 포인터와 주소값

동네로봇 2020. 1. 27. 18:51

golang 에서 flag 포인터와 주소값을 사용하게 되었는데,

기본적인 건데도 개념이 확실하게 잡혀있지 않다보니 계속 헷갈렸다.

이 기회에 쉬운 예시를 통해서 확실하게 정리해보기로 했다.

 


 

그림

 

변수를 선언하면 그림과 같이 메모리의 한 부분을 할당하여 선언한 값을 저장하고, 값이 저장된 공간 주소를 가지게 된다.

 

func main() {
	var word = "Hello"
}

word 를 선언한 경우, 그림1처럼 주소 0000이라는 곳에 "Hello" 라는 string 값이 저장이 된다.

즉, 변수마다 고유의 주소를 할당받게 되는 것이다. 

 

주소값(&)word의 "Hello" 가 아니라 그 주소값을 가져올 수 있다.  

func main() {
	var word = "Hello"
    
	fmt.Println(word, &word)
}

결과 값 :  Hello  0xc00220330

 

 

포인터(*)프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수를 말한다. 

포인터 변수에 주소값을 대입하여 그 주소가 가지고 있는 value를 처리할 수 있다. 

func main() {
	var word = "Hello"
	var *p = &word
    
	fmt.Println(word, &word, *p)
}

결과 값 :  Hello  0xc00220330 Hello

 

여기서 선언된 *p  는 word 의 주소값을 대입받아 Hello를 받아올 수 있으며, *p값을 변경하면 0xc00220330 주소에 저장된 Hello 값도 변경된다. 

 

 

아래 예시를 보면 * 와 &를 더 자세히 이해할 수 있다. 

func main() {
	val := 1024
    
	fmt.Println(val, &val)

	callbyvalue(val)
	fmt.Println(val, &val)

	callbyref(&val)
	fmt.Println(val, &val)

	return
}

func callbyvalue(i int) {
	i += 100
}

func callbyref(i *int) {
	*i += 100
}


 

결과값 : 1024 0xc000010130
           1024 0xc000010130
           1124 0xc000010130

 

callbyvalue 에서는 새로운 i라는 변수에 1024라는 값을 저장하고, +100을 한 것이기 때문에 val 값에 영향이 없다.

 

하지만 callbyref 에서는 i 라는 *int 포인터가 val 의 주소값을 받아 val 값에 연결이 되었고, 연결된 값에 +100을 해주었기 때문데 결과적으로 1124라는 값이 출력된다.

 

여기까지 기초적이지만 헷갈렸던 개념을 정리해보았다!!:))