package main
import "fmt"
func main() {
//포인터
//Go : 포인터 지원(C, C++)
//포인터지원 X(파이썬, C#, JAVA 등)
//주소의 값은 직접 변경 불가능(잘못된 코딩으로 인한 버그 방지)
//메모리 주소를 출력(값의 메모리 주소)
//애스터리스크로 사용(*)
//nil로 초기화(0 아님)
//예제1
var a *int //방법1
var b *int = new(int) //방법2
fmt.Println(a) //nil
fmt.Println(b) //nil
i := 7
a = &i //& 주소값 전달
b = &i
var c = &i //방법3
d := &i //방법4
fmt.Println("ex1 : ", i)
fmt.Println("ex1 : ", &i) //실행 할 때 마다 시스템 별로 변경
fmt.Println("ex1 : ", *a)
fmt.Println("ex1 : ", a)
fmt.Println("ex1 : ", &a) //포인터 변수 a의 주소 값
fmt.Println("ex1 : ", *b)
fmt.Println("ex1 : ", b)
fmt.Println("ex1 : ", &b) //포인터 변수 b의 주소 값
fmt.Println("ex1 : ", *c)
fmt.Println("ex1 : ", c)
fmt.Println("ex1 : ", &c) //포인터 변수 c의 주소 값
fmt.Println("ex1 : ", *d)
fmt.Println("ex1 : ", d)
fmt.Println("ex1 : ", &d) //포인터 변수 d의 주소 값
}
package main
import "fmt"
func main() {
//예제1
type bag struct{ witdh, height, weight float32 } //구조체
var p *int = new(int)
var p_bag *bag = &bag{20, 50, 30}
fmt.Println("ex1 : ", p)
fmt.Println("ex1 : ", p_bag)
fmt.Println()
//p++ //컴파일 에러, 포인터 연산 허용 X
//p = 0xc071405232 ////컴파일 에러, 주소값 대입 허용 X
//예제2
i := 7
p = &i
fmt.Println("ex2 : ", i, *p, &i, p)
*p++ //1 증가
fmt.Println("ex2 : ", i, *p, &i, p)
*p = 10 //포인터 변수 역 참조 값 변경
fmt.Println("ex2 : ", i, *p, &i, p)
i = 77 //원본 변수 값 변경
fmt.Println("ex2 : ", i, *p, &i, p)
}
package main
import "fmt"
func rptc(n *int) {
*n = 77
}
func vptc(n int) {
n = 77
}
func main() {
//포인터 값 전달
//함수, 메서드 호출 시에 매개변수 값을 복사 전달 -> 함수, 메서드 내에서는 원본 값 변경 불가능
//원본 값 변경 위해서 포인터 전달 가능
//특히 크기가 큰 배열인 경우 값 복사시에 시스템 부담 -> 포인터 전달로 해결 But (슬라이스는 참조 전달)
//예제1
var a int = 10
var b int = 10
fmt.Println("ex1 : ", a)
fmt.Println("ex1 : ", b)
fmt.Println()
rptc(&a)
vptc(b)
//vptc(&b) //에러 발생
fmt.Println("ex1 : ", a)
fmt.Println("ex1 : ", b)
}