본문 바로가기

옛날

[2] C++에 앞서 복습 C언어 포인터 (2)

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
#include <stdio.h>
 
int main() {
 
    int num = 10;
 
    printf("함수 호출 전 실제 num의 값 : %d\n", num);
 
    test(num); //test함수 호출
 
    printf("함수 호출 후 실제 num의 값 : %d\n", num);
 
    return 0;
}
 
int test(int a) {
 
    printf("매개변수 a의 값 : %d\n", a);
    
    a = 20;
 
    printf("변경 후 매개변수 a의 값 : %d\n", a);
 
    return a;
}



가장 대표적인 포인터가 필요한 사례

함수에서 받은 매개변수는 값을 복사해서 가져오는 것이기 때문에 (Call By Value 라고도 한다)

함수를 벗어나면 매개변수는 그대로 사라진다.

즉, 매개변수의 원형(original)은 바뀌지 않는다는 것이다.

하지만 함main함수내의 변수의 값을 바꾸는 함수를 작성할 때가 많다.

그때는 간단히 매개변수에 변수의 주소값을 전달해주면 된다.


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
#include <stdio.h>
 
int main() {
 
    int num = 10;
 
    printf("함수 호출 전 실제 num의 값 : %d\n", num);
 
    test(&num); //test함수 호출
 
    printf("함수 호출 후 실제 num의 값 : %d\n", num);
 
    return 0;
}
 
int test(int * a) {
 
    printf("매개변수 a의 값 : %d\n"*a);
    
    *= 20;
 
    printf("변경 후 매개변수 a의 값 : %d\n"*a);
 
    return a;
}



눈여겨 볼 점은 먼저 16번줄에서 매개변수 자료형을 포인터형으로 한 것

두번째로 9번줄에서 함수를 호출할 때 매개변수에 &을 붙여 주소값을 넘겨준 것

(Call By Address 라고도 한다)


//

결론적으로, 함수에 Call By Value식으로 매개변수를 전달하면 함수 내에서

매개변수를 변경하더라도 매개변수의 원형은 변경되지 않는다. 매개변수는 원형의 값을 복사하여

새로운 변수를 만든 것과 똑같기 때문이다. 하지만 Call By Address식으로 전달하게 되면

주소값은 복사하여도 똑같은 위치를 가리키기 떄문에 주소값이 가리키는 값을 변경시키면

매개변수의 원형도 변경되는 것이다.