728x90
package main
import "fmt"
func main() {
//a는 int 형 이라 선언
var a int
//p는 int형 포인트
var p *int
//p에 a 주소 대입, p의 값은 a의 주소를 가르키고 있다
p = &a
//a는 3으로 대입
a=3
//3
fmt.Println(a)
//0xc000100028 메모리의 주소 나옴
fmt.Println(p)
//포인터가 가르키는 값 3(주소가 가르키는 값)
fmt.Println(*p)
}
포인터 왜 쓰냐
원래 a출력했을 때
x++로 해도
값만 복사됐지 a와 b는 다른거라서 1추가 안되고 여전히 1이었음
x는 괄호 밖에서 역할 못하고
포인터 쓰면
package main
import "fmt"
func main() {
//포인터가 왜 사용되는지 보자`~~~~`
var a int
a=1
//포인터형 *x으로 해서 a의 주소값으로 해야함
Increase(&a)
fmt.Println(a)
}
func Increase(x *int) {
//x가 가지고 있는 값은 메모리 주소인데
//그 메모리가 가르키는 주소의 값은 = 메모리가 가르키는 주소의 (원래)값 + 1
*x=*x+1
//얘는 아까 x++와 같은 거라 볼 수 있쥐, 그때 포인터로 안하면 a에서 값만 복사돼서 x++여도 x는 함수 안이라서 a가 늘어나진 않았어
}
이거 사용해서
structure로 만든 거 보기
함수는 값이 복사돼서 쓰이기만 하지
안에 있는 s는 다 다른거임 그래서 결과도 넣은 거 안나오고
수학,a라고 나옴
package main
import "fmt"
type Student struct {
name string
age int
grade string
class string
}
func (s Student) PrintSungjuk(){
fmt.Println(s.class,s.grade)
}
func (s Student) InputSungjuk(class string, grade string){
s.class = class
s.grade =grade
}
func main(){
var s Student= Student{name: "t",age:23, class: "수학",grade: "A"}
s.InputSungjuk("과학","c")
s.PrintSungjuk();
}
s를 포인터형으로 받으면 해결됨!!!
*Student로 바꿔주면 됨
package main
import "fmt"
type Student struct {
name string
age int
grade string
class string
}
func (s *Student) PrintSungjuk(){
fmt.Println(s.class,s.grade)
}
func (s *Student) InputSungjuk(class string, grade string){
s.class = class
s.grade =grade
}
func main(){
var s Student= Student{name: "t",age:23, class: "수학",grade: "A"}
s.InputSungjuk("과학","c")
s.PrintSungjuk();
}
결과가 과학,c로 잘 나옴
복사될 때 student 메모리의 주소만 복사 되는거
s는 메모리 주소값을 가지고 있는거
s.class 한거는
s 메모리 주소값이 가르키고 있는 값의 class를 변경.
C++에서는
메모리 주소가 가르키는 값의 뭘 변경하고 싶을 때
p->grade = "c" 이런 식으로 씀(-> 포인터 앞에 이 화살표 사용)
값value 형태에만 . 점 찍을 수 있음
(값)s.grade
고랭에서는 화살표랑 점 구분 안해
p.grade = "c" 포인터여도 점
s.grade ="c" 그냥 내부 값이어도 점
structure 만들고 그안에 속성넣고
기능도 만들었을 때
그 기능이 그 값의 내용을 변경한다 할때는
값의 형태가 아니라 포인터의 형태로 받는다는거!
포인터 형태로 호출하면 메모리 주소만 복사 된다
값 형태로 호출하면, 인자를 값 형태로 받으면 전체 값이 다 복사 된다
강의 좋구만~~
728x90