1. 참조자 VS 포인터
(개념이 확실하지 않아서 이게 뭐라고 둘이 헷갈렸음)
포인터는 변수의 주소값을 저장하고 있음
참조자는 어느 변수가 가리키는 값을 똑같이 가리키고 있음. 동일한 메모리 공간 가리킴. (&로 표시하지만 주소값을 가리키는 건 아님)
ex)
int num1 = 2021;
int *ptr = &num1;
itn &num2 = num1; // num2는 num1의 참조자
2. 함수의 호출방식
Call by value : 값을 인자로 전달하는 함수의 호출방식
Call by reference : 주소 값을 인자로 전달하는 함수의 호출방식. 주소값을 전달 받아 함수 외부에 선언된 변수에 접근.
Call by value로 정의된 함수의 내부에서는 함수외부에서 선언된 변수에 접근이 불가능하다.
따라서 두 변수에 저장된 값을 서로 바꿔 출력하려면 Call by reference로 main함수 외부를 작성해야 한다.
void SwapByRef(int *ptr1, int *ptr2)
{
int temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp; // call by reference
}
int main
{
int num1 = 10;
int num2 = 20;
SwapByRef(&num1, &num2);
cout << num1 << endl; // 20 출력
cout << num2 << endl; // 10 출력
return 0;
}
3. const
변수를 상수화 시킬 때 사용하는 키워드
상수화된 변수는 변경이 불가능하며, 포인터 변수에도 똑같이 작용한다.
1) 상수 변수
선언과 동시에 초기화하는 것은 가능하나 후에 상수의 값을 변경하려는 건 불가능하다.
"선언과 동시에 초기화"
const int MAX = 20;
2) 상수 포인터
int a = 1;
const int* p1 = &a; // "포인터 변수가 가리키는 주소의 값은 변경X, 주소값은 변경O"
// int* p1을 상수화, p1이 상수가 되어 가리키는 값이 상수가 됨.
int* const p2 = &a; // "포인터 변수가 가리키는 주소의 값은 변경O, 주소값은 변경X"
const int* const p2 = &a; // "포인터 변수가 가리키는 주소의 값은 변경X, 주소값은 변경X"