본문 바로가기
언어/C | C++

[C언어/초보를위한] 몫, 나머지를 구하여 포인터로 담는 div, mod 함수 구현하기 / 왜 포인터를 쓸까?

by 만결숭이 2022. 5. 29.
반응형
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;
}
반응형

댓글