안녕하세요 ! 초보개발자 입니다.
이 블로그는 개인 공부 정리용 블로그 입니다.
혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.
그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.
그럼 시작하도록 하겠습니다.
함수와 포인터
함수를 호출 할 때 인수의 값이 매개변수로 복사되어 전달이 됩니다. 이것을 값에 의한 호출(call by value)이라고 합니다. 반면 포인터를 매개변수로 선언하면 호출된 함수로 주소를 전달하는 것이 가능하며 이것을 참조에 의한 호출(call by reference)라고 합니다. 그럼 먼저 값에 의한 호출에 대해서 알아보도록 하겠습니다.
1) 값에 의한 호출(call by value)
아래의 코드를 보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include<stdio.h> void function(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } int main(void) { int x = 10; int y = 20; printf("x = %d, y = %d\n", x, y); function(x, y); printf("x = %d, y = %d\n", x, y); return 0; } | cs |
위의 코드를 실행하면 다음과 같습니다.
x = 10, y = 20 x = 10, y = 20 |
function(x,y)를 실행하였으니 상식적으로 x,y값이 바뀌어야 하는데 왜 그대로 일까요 ? 단계별로 위의 코드를 알아 보겠습니다.
1) main 함수가 호출되고 변수 x,y에 각각 10,20이 저장 됩니다.
2) 함수 function을 호출하면서 인수로 변수 x , y를 지정 합니다.
function(x,y)
3) 함수 function은 변수 tmp를 이용하여 매개변수 x,y,의 값을 바꿉니다.
4) 함수 function이 종료되면서 function의 x,y,tmp는 제거가 되고 main의 x,y의 값은 바뀌지 않습니다.
그러면 어떻게 해야 function함수에서 main 함수의 값을 바꿀 수 있을까요 ?
위에서 알아본 값에 의한 호출은 그저 저장된 값만 전달할 뿐이기 때문에 호출된 함수에서 전달받은 값의 주소를 알 수 없습니다. 그래서 값을 변경할 수 없었습니다. 그러나 함수를 호출할 떄 값이 저장된 곳의 주소를 전달하면 값을 읽어오는 것 뿐만 아니라 변경하는 것도 가능하게 된다. 호출된 함수에게 값 대신 주소를 전달하는 것을 참조에 의한 호출 이라고 합니다.
예제를 통해서 참조에 의한 호출을 알아보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include<stdio.h> void function(int *x, int *y) { int tmp; tmp = *x; *x = *y; *y = tmp; } int main(void) { int x = 10; int y = 20; printf("x = %d, y = %d\n", x, y); function(&x, &y); printf("x = %d, y = %d\n", x, y); return 0; } | cs |
위의 코드는 main 함수에서 function함수를 호출하면서 x,y의 주소인 &x,&y를 전달 합니다. 그렇기 때문에 포인터 x, y는 main함수의 변수 x,y를 가리키고 있기 때문에 이 변수들의 값을 읽고 변경하는 것이 가능합니다. 그렇기 때문에 아래의 결과와 같이 값이 변경 된 것을 볼 수 있습니다.
x = 10, y = 20 x = 20, y = 10 |
이상으로 함수와 포인터(값에 의한 호출, 참조에 의한 호출)에 대해서 알아보았습니다.
'프로그래밍 > C언어' 카테고리의 다른 글
[C언어] 동적 메모리 할당 (0) | 2017.05.16 |
---|---|
[C언어] 포인터(10) - 배열과 매개변수 (2) | 2017.05.15 |
[C언어] 포인터(8) - 포인터와 문자열 (1) | 2017.05.05 |
[C언어] 포인터(7) -void 포인터와 NULL (1) | 2017.05.03 |
[C언어] 포인터(6) -[] 연산자 (1) | 2017.04.28 |