알 수 없는 사용자 2024. 1. 16. 19:02

 

인수 전달 방식

 

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 << &param_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 : " << &param_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);
}