Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 알고리즘 개념
- BFS
- 백준 2812번
- 백준 9012번
- 백준 2493번
- 백준 10000번
- DFS & BFS
- 백준 2504번
- 그리디 알고리즘(Greedy Algorithm)
- 백준 2261번
- 백준 18352번
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- 위상 정렬(Topological Sort)
- 분할 정복(Divide and Conquer)
- DFS(Depth First Search)
- 백준 1707번
- 이분 탐색(Binary Search)
- 스택(Stack)
- 백준 17608번
- 그래프(Graph)
- DFS
- 동적 프로그래밍(Dynamic Programming)
- 백준 21606번
- 위상 정렬(Topology Sort)
- 백준 1948번
- BFS(Breadth First Search)
- 큐(Queue)
- 다익스트라 알고리즘(Dijkstra Algorithm)
- 이분 그래프(Bipartite Graph)
- 트리(Tree)
Archives
- Today
- Total
Always Be Wise
Call by value & Call by reference 본문
728x90
인자를 전달하는 방식은 크게 Call by value와 Call by reference로 구분된다.
Call by value
기본적으로 C 언어에서 지원하는 방식은 Call by value이다.
함수에서 값을 복사해서 전달하는 방식으로, 인자로 전달되는 변수를 함수의 매개변수에 복사한다.
이렇게 복사되면 인자로 전달한 변수와는 별개의 변수가 되며, 매개변수를 변경해도 원래의 변수에는 영향을 미치지 않는다.
따라서 원본 값을 바꿀 필요가 없는 경우에는 Call by value 방식을 이용하면 된다.
아래 코드를 실행해보면 swap을 진행해도 매개변수가 바뀌는 것일뿐 원래 변수인 a, b의 값이 변하지는 않는다.
#include <stdio.h>
void swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int a, b;
a = 10;
b = 20;
printf("swap 전 : %d %d\n", a, b);
swap(a, b);
printf("swap 후 : %d %d\n", a, b);
return 0;
}
Call by reference
함수에서 값을 전달하는 대신 주소값을 전달하는 방식을 Call by reference라고 한다. C언어에서 포인터를 사용해서 주소값을
넘겨주는 것은 엄밀히 말해 주소값 자체를 복사해서 넘겨주는 것이므로 Call by value이다. 이렇게 주소값을 복사해서 넘겨주는
것을 Call by address 방식이라고 한다. 즉, C 언어에서는 Call by reference를 공식적으로 지원하지는 않으나, 의미적, 결과적으로
Call by address를 이용해서 Call by reference와 같이 사용할 수 있다. 아래 코드를 실행해보면 그냥 변수를 넘겨줄 때와 달리
원래 변수의 값도 바뀐다. 이렇게 포인터를 이용해서 Call by reference를 구현한 것이다.
#include <stdio.h>
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a, b;
a = 10;
b = 20;
printf("swap 전 : %d %d\n", a, b);
swap(&a, &b);
printf("swap 후 : %d %d\n", a, b);
return 0;
}
Comments