본문 바로가기
Computer Science

[C언어] scanf가 변수의 주소(&)를 매개변수로 넘겨주는 이유

by DuncanKim 2022. 7. 3.
728x90

[C언어] scanf가 변수의 주소(&)를 매개변수로 넘겨주는 이유

 

키보드로 프로그램 내에 어떤 변수를 첨가하는 함수.

java에는 대표적으로 Scanner, BufferedReader가 있고, python에는 input(), sys.stdin.read~~() 시리즈가 있다.

C언어에는 scanf가 있는데, 이것이 어떻게 작동하는 지 알아볼 것이다.

 

 

int main(){
	int input;
    
	printf("정수를 입력해주세요. :");
	scanf("%d", &input);
	
    return 0;
}

위의 코드는 아래와 같이 콘솔창을 만들 수 있는 코드이다. input이라는 변수 안에 사용자가 키보드로 입력한 값을 담는 것이다.

scanf의 첫번째 인자는 받아올 데이터의 타입을 입력하고, 두번째 인자에는 변수의 주소를 쓰면 된다.

 

int형을 입력받을 경우, 두 번째 인자에는 변수명에 꼭 &을 붙여야 하는데, 그 이유는 다음과 같다.

scanf는 어떤 변수 안에 그 값을 집어넣는 구조인데, 받아온 값을 저장해야 할 공간의 주소를 알려줘야 하기 때문이다.

만약 input이라는 변수명을 알려주면, 컴퓨터는 키보드를 통해서 받아온 값을 어디에 넣을 지를 두 번째 인자를 보고 아는데, 뜬금없이 input의 값, 즉 여기서는 Null을 받아버리는 황당한 상황이 발생하는 것이다.

 

정리를 하면 다음과 같다.

 

scanf 함수 내에서 main 함수에서 선언된 지역 변수에 접근하기 위해서는 해당 변수의 주소를 알아야만 한다.
scanf 함수를 호출하면서 값이 채워질 지역 변수 variable의 주소값을 인자로 전달하기 때문이다.

 

한편 String의 경우에는 그 변수의 이름 자체가 포인터 상수, 즉 주소명을 가지고 있는 것이기 때문에, &를 붙이지 않아도 된다.

 

이와 관련된 개념으로는 Call-by-reference, 포인터 상수 개념도 있는데, 다음 포스팅에서 다루어 볼 것이다.

 

 

 

728x90

댓글