참조 마음대로 고칠 수 있기 때문에
const붙여준다.
포인터도 const 붙이는거 가능하다.
const int || int const
경우가 뭐가 있냐면은
info = &다른변수; // 다른 변수의 주소값으로 대체
info->hp = 1000; // 주소에 접근해 값을 변경
int a = 10;
int* ptr = &a;
int* const ptr2 = &a;
ptr2 = &b; // 이런거 불가능.
주소값 | 변수명 | 데이터 | 주소값 | 변수명 | 데이터 |
---|---|---|---|---|---|
0x12121212 | ptr | 0x23232323 | 0x23232323 | a | 10 |
int* const ptr; 이렇게하면 주소값을 변경 못한다.
즉, ptr2의 데이터 부분을 변경할 수 없다.
int a = 10;
const int* ptr = &a;
ptr->hp = 100; // 이런거 불가능
ptr이 가르키고있는 데이터의 내용물을 변경할 수 없다.
'원격' 바구나의 내용물을 발꿀 수 없음.
const int* const ptr;
이렇게하면됨.
포인터는 처음에 초기화 안해줘도 ㄱㅊ은데
참조는 참조하는 대상이 없으면 안된다.
무조건 어떠한 값이라도 참조하고 있어야한다.
포인터가 인자로 들어오면은 이렇게 체크를 항상 해주어야한다.
아니면 크래쉬 나서 프로그램 뻗는다.
C#에서는 out이라는 '문법'이 따로 존재하는데
C++에서는 OUT이 조금 다르다.
이게 왜 나왔냐하면은
포인터랑 참조는 성향 차이이다.
뭔가 값이 변경되고 없는값도 나올 때는 포인터 사용하고
그냥 읽기 전용일때는 참조사용하는데
읽기 전용이거나 혹시나 참조받은것을 값을 수정해야할때
그냥 함수에다가
Test(info); 이렇게만 넣어주면 뭐하는건지 모르기 때문에
#define OUT 전처리기 한번 선언해주고
void Test(OUT Info& info)
{
info.hp = 1000;
}
이렇게 'OUT'키워드를 사용해서
바뀔 수 있다는 "힌트"를 주는 것이다.
가독성 차원에서는 OUT이 있지만
컴파일 차원에서는 아무것도 없는거랑 똑같다.
#define OUT
void Test(OUT Info& info)
{
info.hp = 1000;
}
void Test(Info& info)
{
info.hp = 1000;
}
똑같은 거다.
이렇게 레퍼런스를 넘겨주고 값이 변경될 수도있다는 힌트를 주는 것이다.
int* ptr = &a;
void Test(int& value)
{
}
Test함수에 인자로 넘겨주려면
Test(ptr) 안된다.
Test(*ptr); 해주어야 주소의 원본에 접근했다! 라는것을 넘겨주면 됨.
(그러면 원본에 접근을 하는 것이니까)
이것을 풀어서 쓰자면은
이런 느낌이다.
PrintInfoRef 함수는 포인터변수를 매개변수로 받는 함수인데
지금 reference라는 참조 변수를 넘겨주려면?
&reference를 넘겨주면된다.
PrintfInfoPtr(&reference);
"이 주소값을 참조해라!" 고 넘겨주면 된다.
풀어서 보면은 이런 느낌이다.