-
Call by value vs Call by referenceC언어 2021. 6. 30. 16:10
C언어에서 함수에 인자를 전달하는 방식은 2가지가 있다.
- 값을 전달 -> Call by value
- 주소를 전달 -> Call by reference
1. Call by value
1234567891011121314151617#include <stdio.h>void swap(int a, int b) {int tmp = a;a = b;b = tmp;}void main() {int a = 10, b = 20;printf("함수 호출 전 a = %d b = %d\n", a, b);swap(a, b);printf("함수 호출 후 a = %d b = %d\n", a, b);}cs - 값에 의한 호출을 보여주기 위한 예시로 a와 b를 서로 바꿔주는 swap함수에 값을 넣었을 경우에 결과는 이러하다.
Call by value - 변수의 이름이 같아도 매개변수로 보내지는 것은 변수의 주소가 아닌 값만 전달되기 때문에 main 함수에서 a와 b의 값이 바뀌지 않는것을 알 수 있다.
2. Call by reference
1234567891011121314151617#include <stdio.h>void swap(int* a, int* b) {int tmp = *a;*a = *b;*b = tmp;}void main() {int a = 10, b = 20;printf("함수 호출 전 a = %d b = %d\n", a, b);swap(&a, &b);printf("함수 호출 후 a = %d b = %d\n", a, b);}cs - 참조에 의한 호출을 보여주기 위한 예시로 위와 같아 보이지만 함수를 호출할 때 인자로 & 연산자를 넣어서 변수의 주소를 넣어주고, 함수를 선언할 때는 인자로 주어진 변수의 주소안에 있는 값을 가져오는 것을 알 수 있다.
Call by reference - 변수의 주소값이 인자로 전달되었기 때문에 swap함수에서 값을 변경하면 main 함수 안에 있는 a와 b의 값에 영향을 준다는 것을 확인할 수 있다.
3. 배열
- 배열의 경우 배열명 == &배열[0](배열 첫번째 인덱스의 주소) 이기 때문에 사용법이 조금 특이하다.
1234567891011121314151617181920212223#include <stdio.h>void func(int* stu) {for (int i = 0; i < 10; i++) {stu[i] = i;}}void main() {int stu[10] = { 0 };printf("함수 호출 전 : ");for (int i = 0; i < 10; i++) {printf("%d ", stu[i]);}printf("\n\n");func(stu);printf("함수 호출 후 : ");for (int i = 0; i < 10; i++) {printf("%d ", stu[i]);}}cs 배열을 인자로 넘겼을때의 결과 - 배열 주소를 인자로 넘겨서 배열 안의 값들을 변경할 수 있다.
'C언어' 카테고리의 다른 글
(C / C++) 파일 입출력 해보기(업다운게임) (0) 2021.07.01 (C/C++) 가위바위보 게임 구현하기 (0) 2021.06.30 (C/C++) 문자열 맞추기 게임 구현하기! (0) 2021.06.29 (C/C++) 폭탄게임(지뢰찾기) 구현해보기! (0) 2021.06.29