인수 전달
인수 전달 방식
1. 값에 의한 인수 전달
2. 주소(포인터)에 의한 인수 전달
3. 참조에 의한 인수 전달
- Lval 참조
- Rval 참조 ( C+11 인가 부터 가능 )
- 포인터에 대한 참조
- 배열에 대한 참조
1. 값에 의한 인수 전달
func(a) 하면 되는 작용들
- int x = a; ( a의 값을 복사해서 넣는다 )
- a의 값을 복사해서 넣는다 ( 따라서 func 내부에서 x 의 값이 바뀐다고 a의 값이 바뀌지 않는다.)
- call by value // 메모리 비공유
void func(int x)
{
x = 20;
}
int main()
{
int a = 0;
func(a);
cout << a << endl; // 0 출력
}
2. 주소(포인터)에 의한 인수 전달
- int* param_ptr = &value; ( 따라서 참조와 다르게 param_ptr 과 ptr_value, value 의 주소(&) 는 다르다. )
- 가리키는 주소값을 복사해서 넣는다. (func 내부에서 x 의 값이 바뀌면 value의 값도 바뀐다.)
- call by value // 메모리 공유
void func(int* param_ptr)
{
*param_ptr = 100;
cout << ¶m_ptr << endl; // 0x7ffe1436c118
}
int main()
{
int value = 5;
int * ptr_value = &value;
cout << value << endl; // 5
func(&value); // ⭕ 가능
cout << value << endl; // 100
func(ptr_value); // ⭕ 가능
cout << &ptr_value << endl; // 0x7ffe1436c140
// func(5); // ❌ 안됨.
}
3. 참조에 의한 인수 전달
- Lval 참조
- Rval 참조 ( C+11 인가 부터 가능 )
- 포인터에 대한 참조
- 배열에 대한 참조
- Lval 참조
- int& param_x = a; ( 인자 자체의 주소를 넘긴다. 따라서 param_x와 a 의 주소(&)는 동일하다. )
- 해당인자의 주소를 넣는다. (func 내부에서 x 의 값이 바뀌면 value의 값도 바뀐다.)
- call by reference // 메모리 공유
void func(int & param_x)
{
param_x = 20;
cout << "11 : " << ¶m_x << endl;// 0x7fff4ca89894
}
int main()
{
int a = 0;
cout << a << endl; // 0 출력
func(a);
cout << a << endl; // 20 출력
cout << "22 : " << &a << endl; // 0x7fff4ca89894
}
- Rval 참조 ( C+11 인가 부터 가능 )
- 포인터에 대한 참조
int x = 1; int* ptr_x = &x;
int*& ptr = ptr_x;
void func(int *& ptr)
{
// cout << ptr << endl;
*ptr = 3;
// *(*(&ptr)) = 3; // 위에 꺼랑 동일한 기능
}
int main()
{
int x = 1;
int * ptr_x = &x;
cout << x << endl; // 1
*ptr_x = 2;
// *(*(&ptr_x)) = 2;
cout << x << endl; // 2
func(ptr_x);
cout << x << endl; // 2
}
- 배열에 대한 참조
int (&arr)[4] = array;
void func(int (&arr)[4])
{ // int (&arr)[4] = array;
for (auto & elements : arr)
cout << elements << endl;
}
int main()
{
int array[4] = {1, 2, 3, 4};
func(array);
}
- vector에 대한 참조
vector<int>& arr = v_array;
void vfunc(vector<int> & arr)
{ // vector<int>& arr = v_array;
for (auto & elements : arr)
cout << elements << endl;
}
int main()
{
vector<int> v_array = {1,2,3,4};
vfunc(v_array);
}