함수**
3 - 3 함수 호출 방법
목차
- 값에 의한 호출
- 주소에 의한 호출
프로그래밍 교육 방법
- 프로그래밍...특히 c언어로 문제를 해결하는데에 있어서 가장 중요한 것은 '포인터'라 할 수 있다.
- 포인터는 어려운 문법이라기보다 우리가 풀어야할 문제를 어떤 형태로 풀 수 있는지를 아는 게 중요하다.
이때 swap( ) 이라는 함수를 어떻게 만들어야 할까?
더 생각 하기 : 다른 함수를 통해서 두 개의 변수 값을 서로 바꾸려면?
- main 함수에 있는 변수 두 개의 값을 정렬을 하기 위해 서로 바꾸고 싶은데 자주 사용되는 기능이므로(main에 두면 지저분해지니까) 함수를 만들어서 호출하고 싶다면?
문제 해결 하기
- main안에서 변수 값을 temp변수를 사용하여 서로 변경하면 바뀌지만, 다른 함수로 두 변수 값을 call by value 보내서 바꾼다면 지역 변수 특성상 main 함수 영역에 있는 변수 값을 두 개 모두 바꿀 수 없음(return은 1개 값만 가지고 올 수 있으므로)
그렇다면 다른 방법을 찾아보자.
함수 호출 방법 : 주소에 의한 호출(call by address)
- 해결 방법
- main함수에 있는 변수의 주소값을 가지고 swap()함수를 호출하면 swap()함수에서 main함수의 변수 값을 바꿀 수 있음(이럴때 포인터 변수 사용)
- 바꾸기 위해서는 역참조 연산자를 사용해야 함
- 포인터도 변수이다. 변수는 저장 공간인데 여기서의 변수는 특수해서 주소를 값으로 가지는 변수라는 것.
- 일반 변수와 차별화를 두기 위해 포인터 변수를 선언할때에는 변수 앞이나 자료형 뒤에 * 를 붙이게 된다. 그래서 포인터 변수를 선언하는 방법은 intp, intq처럼 한다.
- 포인터변수는 주소값만 값으로 가지기에 .. &는 주소를 가리키는 의미이므로 intp에 a의 주소값을 넣고싶다면 intp = &a를 하면 된다.
- 포인터변수 P는 내려와서는 * 가 필요 없다.
- 근데 왜 주소를 넣을까? 이는 나중에 설명한다.
- 주소를 넘긴 후에 내가 정말 바꾸고싶은 것은 주소가 아니라 main의 a에 있는 값을 수정하고싶다면? 그럴때 역참조 연산자를 사용한다.
포인터가 주소를 가지려면 * 가 없다. 포인터 변수 앞에 * 를 넣으면 얘가 가리키는 a에 가서 값을 바꿀 수 있는 영향력을 주게 된다.
함수 호출 예제 sum(), swap()
#include<stdio.h>
int sum(int a, int b); // 함수 원형
void swap(int *p, int *q); // 함수 원형
int main(void){
int a, b, total;
printf("Input two integers : ");
scanf("%d%d", &a, &b); // 10 20
printf("a: %d, b: %d \n", a, b);
total = sum(a, b); // call by value
printf("** sum function call ** \n");
printf("%d + %d = %d \n", a, b, total);
swap(&a, &b); // call by address
// 주소를 넣어서 보낸다.
printf("** swap function call ** \n");
printf("a: %d, b: %d \n", a, b); // 20 10
return 0;
}
int sum(int a, int b){
int total;
total = a + b;
return total;
}
// swap은 sum과 달리 return값이 없으므로 앞부분이 void가 된다.
// 주소를 받을 수 있는 포인터 변수 int *p, *q가 있다.
void swap(int *p, int *q){
int temp;
temp = *p;
*p = *q;
*q = temp;
// return은 없다. 단지 위의 세 줄을 가지고 main의 값이 바뀐다.
}
++++++++++ console창 결과 값 ++++++++++
Input two integers : 10 20
a: 10, b: 20
** sum function call **
10 + 20 = 30
** swap function call **
a: 20, b: 10
요약
- 값에 의한 호출
- 주소에 의한 호출
- 포인터 변수
- 역참조 연산자(deference operator)
문법의 중요도보다는 문제해결에 있어서 함수를 사용하는데 이 데이터를 어떻게 넘기고 받을 것이냐, 원본에 있는 값을 변경할 것이냐 안할 것이냐에 따라서 이러한 방법들을 사용한다.
반응형
'컴퓨터공학입문' 카테고리의 다른 글
4 - 2 연산자 예제 실습 (0) | 2019.09.04 |
---|---|
4 - 1 연산자(사칙, 관계, 논리 연산자)(operator) (0) | 2019.08.31 |
3 - 2 함수와 매개변수 (0) | 2019.08.28 |
3 - 1 사용자 정의 함수 (0) | 2019.08.28 |
2 - 4 프로그램 구조 (0) | 2019.08.26 |