Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Tags more
Archives
Today
Total
관리 메뉴

Hello Security World

C언어 [Call By Value & Call By Reference] 본문

프로그래밍/C

C언어 [Call By Value & Call By Reference]

프로앱등이 2020. 5. 3. 19:27

값에 의한 호출(Call By Value)

값에 의한 호출은 실 매개 변수의 값만 형식 매개변수에 전달되기 때문에 호출된 함수는 형식 매개변수만 조작할 수

있을 뿐이고 실 매개변수에는 직접 접근할 수가 없다. 실 매개변수와 형식 매개변수의 기억 장소가 따로 유지되므로

서로 다른 변수로 취급된다. 값에 의한 호출은 말 그대로 값 자체를 함수에 넘겨주는 방법을 의미한다.

죽, 함수에 매개변수를 전달 할 때 숫자 또는 문자 그 자체를 전달할 경우 받아들이는 함수는 그 값 자체를

받아들이게 된다. 그리고 원래 값을 전달한 곳에는 아무런 영향을 미치지 않는다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
int call_val(int su);
void main()
{
    int num = 100,after;
    printf("값에 의한 호출 프로그램\n");
    printf("함수 호출 전의 num값 [%d]\n",num);
    
    after = call_val(num);
    printf("함수 호출 후의 값[%d]\n",after);
    printf("함수 호출 후의 num변수의 값[%d]\n",num);
}
 
int call_val(int su)
{
    su = su + 5;
    return su;
}
 
값에 의한 호출 프로그램
함수 호출 전의 num값 [100]
함수 호출 후의 값[105]
함수 호출 후의 num변수의 값[100]
 

 

main() 함수에서 변수 'num'을 정의하고 'call_val()'함수를 호출하여 call_val()함수의 'su' 에 100 이라는 값을 복사해서 넣는다.

call_val()함수에서는 변수 su의 값을 5증가시켜 main()함수로 연산 결과 값 105를 반환하게 된다.

위의 코드결과 처럼 num변수의 값을 변경할 수 는 없다. 그 이유는 스텍내부에 스택프레임이라는 공간이 존재하고 그 공간에는

각각의 함수 위치가 존재한다 '스쿠퍼' 영역이 존재하는 것이다. 따라서 main() 함수와 call_val() 함수의 영역은 서로 다른

영역이기 때문에 접근할수가 없다.

하지만 분명 프로그래밍을 하다보면 위와같이 다른 함수에 있는 값을 바꿔야 할때가 있을것이다

이럴때 쓰는 것이 'Call By Reference' 이다.

참조에 의한 호출(Call By Reference)

참조에 의한 호출은 실 매개변수(호출하는 쪽)의 주소 값을 호출하여 함수의 형식 매개변수에 전달하는 방식을 사용한다

형식 매개변수의 주소를 알고 있기 때문에 이를 이용하여 실 매개변수의 값을 변경할수 있다. '참조에 의한 호출' 방식은

실 매개변수와 형식 매개변수가 동일한 기억 공간을 사용하는 같은 변수이므로 형식 매개변수의 값이 변경되면 실 매개변수의

값도 바뀌게 된다.

이러한 방식을 C언어에서는 따로 지정하지 않기 때문에 포인터(*)를 사용하여 '참조에 의한 호출' 방식을 사용해야만 한다.

#include <stdio.h> int refer_val(int *su); void main() { int num = 100; printf("참조에 의한 호출 프로그램\n"); printf("함수 호출 전의 num값 [%d]\n",num); refer_val(&num); printf("함수 호출 후의 num값 [%d]\n",num); } int refer_val(int *su) { *su = *su + 5; } 참조에 의한 호출 프로그램 함수 호출 전의 num값 [100] 함수 호출 후의 num값 [105]

위와 같은 결과 값을 확인할수 있다. refer_val()함수를 호출할때 &num 의 주소를 실 매개변수로 넘겨준다 , 형식 매개변수에서는

*su 포인터형 변수로 받는다 그 이유는 포인터 변수는 변수가 가리키고 있는 곳(메모리 주소) 의 실제값을 의미하고 변수 앞에 &를 붙

히면 값이 실제로 저장되어 있는 메모리의 주소값을 대입하게 된다.

함수의 매개변수 전달 형태는 위와 같이 크게 2가지의 방법으로 정리할수 있다.