Home scanf에서 변수를 받을때 &를 사용하는 이유
Post
Cancel

scanf에서 변수를 받을때 &를 사용하는 이유

어쩌다가 C언어 수업을 또 듣고 있는데 (구구절절히 설명을 하자면 전기전자공학과에서 C언어 수업을 들었는데 인증안해준다고 컴공가서 또 듣고 있다 ㅋㅋㅋ) scanf를 보면서 나도 참 C 언어를 모르면서 안다고 착각하고 있다는 생각이 들어서 정리해본다.

printf를 사용할때 변수를 출력하고 싶으면 %d라고 자료형을 선언을 해주고 “뒤에다가 변수 이름을 집어 넣지만 scanf를 사용할때는 내가 넣고자하는 변수에다가 & 기호를 넣어주어야 한다.

1
2
3
4
5
6
7
8
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS

int main() {
	int a;
	printf("숫자를 입력해주세요 : ");
	scanf("%d", &a);
}

그때는 그냥 기계적으로 scanf를 이용할려면 &를 사용해야 한다 정도로 외우고 있다가 조금 지나서 포인터와 연결리스트를 구현할때 scanf를 쓰지만 &를 안쓰는 것을 보고 어리둥절 할지 모르겠다. 원리를 알면 쉽다.

scanf와 &의 의미를 이해하기 위해서는 포인터의 개념이 들어가게된다.

C/C++에는 다른 언어와는 달리 강력한 기능이 있는데 바로 메모리 직접 제어다. 이게 가능한 이유는 언어가 72년도 당시 컴퓨터 성능이 나쁘기 때문에 메모리 할당하고 해제하는거 하나하나 소중한 자원이었기 때문이었지만

지금 언어의 포인터 개념은 컴퓨터공학의 뉴비절단기가 되어버렸다

img1 daumcdn

다시 돌아가서 우리가 int a라는 변수를 하나 생성할때 3가지가 만들어진다.

메모리상의 주소, 변수값, 변수명

printf문을 사용할때 우리가 %d에다가 a라는 변수명을 알려주게 되면 변수값을 불러오게 된다.

변수에 의한 참조(call by value) 들어보았을 것이다.

img

자 그렇다면 scanf는?

1
scanf("%d", &a);

scanf는 우리는 지금 정수형(%d)자료형을 넣을거야. 그러니까 넣을 곳의 위치(주소)를 불러 달라는 것이다.

그러니까 a라는 변수를 주는 것이 아니고 & 주소 참조 기호를 써서 &a, 즉 a의 주소를 넘겨준다.

그러면 포인터형 변수는 참조가 필요가 없을 것이다. 그 자체가 주소를 담고 있는 변수이기 때문이다. 포인터 변수로 한번 값을 받아보자

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS

int main() {
	int a;
	int* b;
	b = &a;
	printf("숫자를 입력해주세요 : ");
	scanf("%d", b);
	printf("---------------------\n");
	printf("변수를 통해 불러온 숫자 : %d\n", a);
	printf("포인터를 이용해 불러온 숫자 : %d", *b);
}

일단 int a로 정수형 변수를 선언하고 int *b로 포인터 변수를 선언한다. 포인터 변수는 주소 위치를 담는 변수라고 보면 된다. 여기서 주의해야 할 것은 포인터 변수만으로는 의미가 없다. 이 포인터 변수가 “어떤 변수”를 지정할 것인지 알려줘야 한다.

1
b = &a;

포인터 변수 b를 선언했고 b의 주소는 a라고 알려준다. 이제 포인터변수 b는 a를 가르키게 된다.

img1 daumcdn

printf에다가 그냥 a를 불러올 수 있고, 포인터변수의 경우 * 참조 표시를 해주면 똑같은 결과를 얻을 수 있다.

다시 한번 정리하면 scanf는 내가 어디에 저장할지 주소를 알려줘야 한다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.

input 에러 ValueError not enough values to unpack (expected 2, got 0) 해결방법

동적할당과 정적할당 차이 정리 (malloc, free) 함수 사용법