반응형
void div_mod(int a, int b, int *div, int *mod)
{
*div = a / b; //몫
*mod = a % b; //나머지
}
우선 코드를 먼저 살펴본다.
함수에 대한 설명 :
매개변수로 정수 타입의 변수 두 개(a, b)와
정수 포인터 타입의 변수 두 개(div, mod)가 필요한
div_mod라는 이름의 함수이다.
반환값(return 값)이 없기 때문에 함수의 타입은 void이다.
div 변수에는 a에서 b를 나눈 몫이 담기고, mod 변수에는 나누고 남은 나머지가 담긴다.
그런데 왜 그냥 변수가 아닌 포인터 변수를 사용해야 할까?
반응형
포인터 변수를 사용하지 않았을 경우 )
void div_mod(int a, int b, int div, int mod)
{
div = a / b;
mod = a % b;
}
int main()
{
int x = 10;
int y = 3;
int d = 0; //몫을 담기 위한 변수
int m = 0; //나머지를 담기 위한 변수
div_mod(x, y, d, m);
}
구체적인 예를 들기 위해 main 함수를 덧붙였다.
main 함수에서 div_mod(x, y, d, m)를 호출했을 때
d, m에 3, 1이라는 값이 잘 담겨 있을까?
아니다.
호출을 하고 나서도 d, m에는 초기화 해줬던 값인 0, 0이 들어 있을 것이다.
div_mod 함수의 매개변수인 a, b, div, mod는 함수 안에서만 유효하다.
함수를 끝까지 돌고 다시 main 함수로 되돌아가면 사라지는 변수라는 뜻이다.
div_mod 함수를 호출할 때 사용할 값(위의 예제에서는 x, y, d, m)을 받아 올 뿐이다.
그러므로 함수 안에서는 식이 잘 동작했을지 몰라도, 결과값이 그대로 담겨오지는 않는다.
우리가 원하는 동작은 d와 m에 식의 결과값이 담기는 것이다.
이를 더 구체적으로 설명하면,
실제로 변수 d와 m이 존재하는 위치에 값을 넣어주어야 한다.
그렇기때문에 변수가 위치한 주소를 가리키는 포인터 변수를 사용하는 것이다.
매개변수로 받은 a에 몫을, b에 나머지를 저장하는 함수의 경우 1)
void div_mod(int *a, int *b)
{
int tmp;
tmp = *a / *b;
*b = *a % *b;
*a = tmp;
}
매개변수로 받은 a에 몫을, b에 나머지를 저장하는 함수의 경우 2)
void div_mod(int *a, int *b)
{
int div;
int mod;
div = *a / *b;
mod = *a % *b;
*a = div;
*b = mod;
}
반응형
'언어 > C | C++' 카테고리의 다른 글
[C언어/초보를위한] 문자열을 붙이는 strcat, strncat 함수 구현하기 (3) | 2022.09.19 |
---|---|
[C언어/초보를위한] 문자열을 복사하는 strcpy, strncpy 함수 구현하기 (0) | 2022.06.04 |
[C언어/초보를위한] 정수의 배열을 뒤집는 함수 구현하기 (0) | 2022.01.27 |
[C언어/초보를위한] 문자열의 길이를 반환하는 strlen 함수 구현하기 (0) | 2022.01.27 |
[C언어/초보를위한] 문자열을 출력하는 putstr 함수 구현하기 (0) | 2022.01.27 |
댓글