ex) num1과 num2의 숫자를 서로 바꾸는 함수
#include <iostream>
using namespace std;
void Swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int num1 = 5;
int num2 = 10;
Swap(num1, num2);
cout << "num1 :" << num1 << " num2 : " << num2;
return 0;
}
매개변수로 num1과 num2를 넣었지만 Swap함수를 거치고도 '결과값이 변하지 않았다'
-> num1의 값과 num2의 값이 Swap함수로 들어갈때 값이 복사되어 들어갔기 때문에 num1, num2는 int a, int b와 별개인 것
int a와 int b에 복사되어 들어온 값인 10과 5는 서로 바껴서 a = 5 b = 10이 되었다
-> Swap함수가 종료되고 지역변수인 a, b는 메모리에서 해제된다
-> 지역변수 : 함수 내부에 선언된 변수
하지만 메인 함수에 선언된 num1,num2와는 별개이기 때문에 이 두 정수는 바뀌지 않았다
함수 내부로 값이 복사되어 들어가기 때문에, 외부의 값과 별개이다
Call-by-Reference 주소값을 이용
-> Call-by-Address 라고도 칭함
Call-by-Reference 참조자를 이용
ex) num1과 num2의 값을 서로 바꾸는 함수
#include <iostream>
using namespace std;
void Swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int num1 = 5;
int num2 = 10;
Swap(&num1, &num2);
cout << "num1 :" << num1 << " num2 : " << num2;
return 0;
}
매개변수로 num1과 num2의 주소값을 넣어 인자로 전달한다
int *a 와 int *b는 인자로 받은 값의 메모리 주소를 저장하는 포인터 변수이다
#include <iostream>
using namespace std;
void Swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int num1 = 5;
int num2 = 10;
Swap(num1, num2);
cout << "num1 :" << num1 << " num2 : " << num2;
return 0;
}
참조자(&)는 같은 데이터 공간을 가리키는 변수지만, 이름만 다를뿐이다
함수에 들어간 값이 주소값이기 때문에
복사비용이 발생하지 않는다 (값복사x)
함수 내부에서 변한 값이 외부에도 적용된다
포인터 변수는 외부의 num1과 num2의 주소값을 저장하고 있기 때문에, 함수 내부에서 값이 변동되면 그 값이 외부의 num1과 num2에도 적용되는 것
&연산자를 사용하는 경우는 2가지가 있다

예를 들어, Swap함수의 인자로 넘겨주는 값에 &num1, &num2는 해당 변수의 주소값을 넘겨준다는 것
-> &가 주소를 반환해주는 연산자

새로운 변수에 &가 붙을 경우, 참조자이다
다른 변수의 별칭으로, 같은 메모리 공간을 가리키게 된다

예를 들어, Swap함수에 지역변수 a와 b는 num1과 num2의 참조자이다
-> 같은 메모리 공간을 가리키게 되어 a와 b의 값에 변화가 생기면 num1과 num2도 동일하게 변화가 적용된다
