C언어 관련 전공 과목을 공부하면서 값에 의한 호출 vs 주소에 의한 호출에 대해 정리한 내용을 공유해 봅니당
값에 의한 호출 & 주소에 의한 호출
값에 의한 호출
void swap(int , int);
int main(void){
int i = 3, j = 5;
swap(i, j);
printf("%d %d\\n", i, j);
/* 3 5 is printed */
return 0;
}
void swap(int p, int q){
int tmp;
tmp = p;
p = q;
q = tmp;
}
이렇게 해서 값을 바꿔도 실제 값이 변경되지는 않는다.
void swap으로 간 변수는 함수가 끝나면 메모리 공간이 사라진다 → 즉 실제 원본 값은 변하지 않는다.
주소에 의한 호출
- 함수의 매개변수를 포인터 형으로 선언한다
- 함수 몸체에서 역참조 연산자를 사용해 주소가 가리키는 공간의 값에 직접 접근한다.
- 함수를 호출할 때 주소를 인자로 전달한다.
void swap(int*, int*);
int main(void)
{
int i = 3, j = 5;
swap(&i, &j);
printf("%d %d\\n", i, j);
return 0;
}
void swap(int *p, int *q)
{
int tmp;
int tmp = *p;
*p = *q;
*q = tmp;
}
위에서 swap 함수를 먼저 선언한 후 아래에서 구현
인자를 전달할 때, 변수의 주소를 전달하면서 swap 함수의 인자인 포인터들이 해당 주소값을 할당 받는다
이를 통해 실제 값을 변경한다.
<예제>
int divide_p(int, int, int*, int*);
int main () {
int i, j, q, r;
printf("피제수를 입력하세요 : ");
scanf("%d", &i);
printf("제수를 입력하세요 : ");
scanf("%d", &j);
if (divide_p(i, j, &q, &r)){
printf("0으로 나눌 수 없습니다. \\n");
}
else {
printf("%d / %d : 몫은 %d이고, 나머지는 %d입니다. \\n", i, j, q, r);
}
return 0
}
위를 만족시킬 divide_p 함수를 작성해보자
int divide_p(int i, int j, int *q, int *r){
if (j == 0) {
return -1;
}
*q = i / j;
*r = i % j;
return 0;
}
- if문 → 0은 false 0이 아닌 모든 값은 true
- true와 false를 사용할려면 stdbool.h을 include해야 한다. //_Bool로 bool의 형을 지정할 수 있다.
- true와 false는 1과 0으로 구분하자
- //는 파이썬에서 사용하는 연산자이다 C언어에서는 /를 사용하자
- -1은 오류 상황인 것을 나타낸다 → 오류인 상황에는 1이 아니라 -1을 적자
수정된 최종 코드