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는 주소가 필요해서 그 변수의 주소를 전달해야 한다. 포인터와 배열은 이미 주소를 가지고 있으므로 따로&를 사용하지 않는 것이다.