scanf()
는 문자열을 입력받을 때 사용하는 함수로 공백을 기준으로 입력을 처리한다.
일반적으로 변수에 값을 입력받을 때는 &
연산자를 사용하여 그 변수의 메모리 주소를 scanf()
에 전달한다.
🖍️ scanf를 사용할 때 어떤 변수에는 주소 연산자(&)를 사용하고, 어떤 변수에는 사용하지 않는 이유는?
자료형에 따라 다르다. 구체적으로 말하면, 일반 변수와 포인터 변수의 차이 때문이다.
일반적으로 변수에 값을 입력받을 때는 &
연산자를 사용하여 그 변수의 메모리 주소를 scanf()
에 전달해야 한다. scanf
는 입력값을 그 주소에 저장하므로, 변수의 주소가 필요하다.
int x;
scanf("%d", &x); // x의 주소를 전달해야 함
x
는 일반 변수이므로, 값을 입력받을 때 주소를 전달해야 함.scanf("%d", &x)
는 정수형 변수를 입력받을 때, &x
를 통해 x
의 메모리 주소를 전달하고, scanf
가 그 주소에 값을 저장.포인터 변수는 이미 주소를 저장하는 변수이기 때문에, 따로 &
연산자를 사용하지 않는다. 즉, 포인터 변수 자체가 메모리 주소를 저장하고 있으므로, 그 자체로 scanf
에 전달할 수 있다.
int x;
int *p = &x;
scanf("%d", p); // p 자체가 이미 x의 주소를 저장하고 있으므로 & 필요 없음
p
는 이미 x
의 주소를 저장하는 포인터 변수임.scanf
에서 추가로 주소 연산자 &
를 사용하지 않아도 됨. p
자체가 주소를 가리키기 때문임.문자열을 입력받을 때, char 배열은 배열의 이름이 이미 배열의 첫 번째 요소의 주소를 나타내기 때문에 &
연산자를 사용하지 않는다.
char str[100];
scanf("%s", str); // str은 이미 첫 번째 문자의 주소를 의미하므로 & 필요 없음
str
은 char
배열이며, 배열의 이름(str
)은 배열의 첫 번째 문자의 주소를 나타냄.scanf
에 입력할 때 따로 &
를 사용하지 않고 str
자체를 전달하면 됨.int
, float
...): 주소 연산자 &
를 사용해야 함. 예: scanf("%d", &x);
int *
, float *
...): 포인터 변수 자체가 주소를 가리키기 때문에 &
를 사용하지 않음. 예: scanf("%d", p);
&
를 사용하지 않음. 예: scanf("%s", str);
이 차이는
scanf
가 입력된 값을 해당 메모리 주소에 저장하는 함수이기 때문에 발생한다. 일반 변수는 그 자체로 값을 저장하는 공간이지만,scanf
는 주소가 필요해서 그 변수의 주소를 전달해야 한다. 포인터와 배열은 이미 주소를 가지고 있으므로 따로&
를 사용하지 않는 것이다.