본문 바로가기
Study/C언어

C언어 - 포인터 Call-By-Value와 Call-By-Reference의 구분, 더블포인터의 이해

by 멘탈은안녕하신가 2018. 12. 17.
728x90
반응형
  • 예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdio.h>
 
int num1 = 10;
int num2 = 20;
 
int changednum_value(int x,int y)
{
                 int nonnum1 = x ;
                 x = y ;
                 y = nonnum1;
}
 
int changednum_reference2(int **o, int **p)
{
                 int nonnum2 = **o ;
                ** o = **p ;
                ** p = nonnum2;
// 더블 포인터를 썼기 때문에 매개변수에 더블 포인터를 써줘야 한다. (*o => 틀림, **o => 맞음)
 
int changednum_reference1(int *a,int *b)
{
                changednum_reference2(& a, &b );
/* 포인터를 썼기 때문에 매개변수에 포인터를 써준다.
함수 changednum_reference에서 main의 num1,num2를 포인팅하는것이기 때문에 *를 써준다. */
 
int main(void )
{
 
    printf"=== 바뀌기 전의 상태\ === \n" );
    printf"num1 = %d, num2 =  %d\n \n" , num1, num2);
 
    changednum_value(num1, num2); // call by value는 changednum_value 함수에서 만든 지역변수가 변하고 빌려준 인수값은 돌려받지 않기 때문에 변하지 않는다.
    printf"=== call by value 후의 상태 === \n" );
    printf"num1 = %d, num2 = %d\n\n" , num1, num2);
 
    changednum_reference1(&num1, &num2); // 여기서 포인터함수(*)가 아닌 주소연산자(&)를 쓴 이유는, num1과 num2를 changednum_reference 함수에서 받아가는것이기 때문이다.
    printf"=== call by reference 후의 상태 === \n" );
 
    if (num1 == 10)
    {
        printf"=== 바뀌지 않았습니다.(ㅠ_ㅠ) === \n" );
        printf"num1 = %d, num2 = %d\n" , num1, num2);
    }
    else
    {
        printf"=== 바뀌었습니다. (오예!) === \n" ); 
        printf"num1 = %d, num2 = %d\n" , num1, num2);
    }
 
    return 0;
}
 
c

 

  • 실행결과

1. call-by-value는 함수 내에 선언된 지역변수가 인수로 받은 값을 자료교환 하고, 값은 되돌려주지 않기 때문에 변함이 없다.

 

2. call-by-reference는 포인터 함수로 주소를 받고, 값에 간접 접근을 해서 값을 교환하기 때문에 main 내에서도 값이 바뀐다.

 

3. call-by-reference의 활용으로 두개의 함수를 활용하는 더블 포인터를 사용한다. 인자가 담겨있는 변수는 주소연산자(&)를 전달받아서 사용하고, 매개변수는 포인터 변수(*)를 사용한다. 더블포인터에는 매개변수에 포인터변수를 두개(**) 사용한다.

 

4. 메모리 접근방법.

- 직접 접근 : 변수를 통해서 접근하는 방식

- 간접 접근 : 포인터 변수와 같이 주소를 통해 접근하는 방식

 

 

예전에 했던거 옮겨쓰는데 문장이 조금 이상한거 같네...

728x90
반응형

댓글