C언어 함수 매개변수의 값, 주소 전달에 따른 차이

C언어 함수의 매개변수를 값으로 전달할 경우 사용자 정의 함수와 main() 영역은 지역변수라 서로 관여하지 않습니다. 함수와 main() 영역의 변수명이 같을 때, 매개변수를 주소로 전달할 경우 포인터를 사용하면 서로의 변수에 영향을 끼칠 수 있습니다.

C언어 함수의 매개변수를 값으로 전달

사용자 정의 함수의 매개변수를 값으로 전달하는 할 경우 변수값만 이동이 되고 main() 함수내의 변수에는 변화가 없습니다.

#include <stdio.h>
//사용자 정의 함수 선언
void JustNumber(int b);


//main () 영역
int main()
{
	int a = 3;
	JustNumber(a);
	printf("a값은 %d 입니다. \n", a);
}

//사용자 정의 함수
void JustNumber(int b)
{
	b = b + 2;
	printf("함수 b의 값은 %d 입니다. \n", b);
}

결과

함수의 b값은 5 입니다.
반환된 a값은 3 입니다.

왜냐하면 사용자 정의 함수 영역과 main() 함수의 변수들은 지역변수이기 때문입니다. 같은 예제에서 함수 영역의 변수명을 동일하게 지정해보면 이해가 됩니다. 변수명이 같아도 지역변수이므로 서로의 변수에 영향을 미치지 않습니다.

#include <stdio.h>
//사용자 정의 함수 선언
void JustNumber(int a);


//main () 영역
int main()
{
	int a = 3;
	JustNumber(a);
	printf("반환된 a값은 %d 입니다. \n", a);
}

//사용자 정의 함수
void JustNumber(int a)
{
	a = a + 2; //매개변수 a는 사용자 정의 함수의 지역변수입니다.
	printf("함수의 a값은 %d 입니다. \n", a);
}

결과

함수의 a값은 5 입니다.
반환된 a값은 3 입니다.

C언어 함수의 매개변수를 주소값으로 전달

함수 영역의 매개변수를 main() 영역에 전달하는 방법은 주소값을 사용하는 방법입니다. main() 함수에서 주소값 자체를 매개변수로 전달할 경우 함수내의 포인터를 이용한 변수 변환은 main() 영역의 변수에도 영향을 끼칩니다.

#include <stdio.h>
//사용자 정의 함수 선언
void JustNumber(int *a);


//main () 영역
int main()
{
	int a = 3;
	JustNumber(&a); //&a 주소를 매개변수로 삽입
	printf("반환된 a값은 %d 입니다. \n", a); //변수 a의 값이 변합니다.

}

//사용자 정의 함수
void JustNumber(int *a) //&a주소가 가리키고 있는 변수값 3이 삽입됨
{
	printf("전달받은 &a의 *a는 %d 입니다. \n", *a);
	*a = *a + 2; // *a = 3 에 2를 더해서 *a에 대입합니다.
	printf("함수의 a값은 %d 입니다. \n", *a);
}

결과

전달받은 &a의 *a는 3 입니다.
함수의 a값은 5 입니다.
반환된 a값은 5 입니다.

값 전달 및 참조 전달의 차이는 다른 프로그래밍 언어에서도 계속 나오는 내용이므로 알아두면 유용합니다.