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
반응형
'Study > C언어' 카테고리의 다른 글
C언어 - 다양한 자료형의 10진수 정수값 구하기 & 오류가 나는 이유 (0) | 2018.12.20 |
---|---|
C언어 - 2차원 배열과 메모리 크기 (0) | 2018.12.20 |
C언어 - sacnf의 &(주소연산자) (0) | 2018.12.17 |
C언어 - int로 선언한 변수에 입력한 값을 char로 출력 할 경우 오류가 나는 이유. (0) | 2018.12.17 |
C언어 - 배열과 스택, 버퍼 오버플로우 (0) | 2018.12.17 |
댓글