C : scanf()의 주소 연산자(&) 사용 여부

m_ngyeong·2024년 10월 15일
0

C

목록 보기
16/16
post-thumbnail

scanf()

scanf()는 문자열을 입력받을 때 사용하는 함수로 공백을 기준으로 입력을 처리한다.
일반적으로 변수에 값을 입력받을 때는 & 연산자를 사용하여 그 변수의 메모리 주소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 배열은 배열의 이름이 이미 배열의 첫 번째 요소의 주소를 나타내기 때문& 연산자를 사용하지 않는다.

char str[100];
scanf("%s", str);  // str은 이미 첫 번째 문자의 주소를 의미하므로 & 필요 없음
  • strchar 배열이며, 배열의 이름(str)은 배열의 첫 번째 문자의 주소를 나타냄.
    scanf에 입력할 때 따로 &를 사용하지 않고 str 자체를 전달하면 됨.

요약

  • 일반 변수 (int, float...): 주소 연산자 &를 사용해야 함. 예: scanf("%d", &x);
  • 포인터 변수 (int *, float *...): 포인터 변수 자체가 주소를 가리키기 때문에 &를 사용하지 않음. 예: scanf("%d", p);
  • 문자열(char 배열): 배열 이름은 첫 번째 요소의 주소를 나타내므로 &를 사용하지 않음. 예: scanf("%s", str);

이 차이는 scanf입력된 값을 해당 메모리 주소에 저장하는 함수이기 때문에 발생한다. 일반 변수는 그 자체로 값을 저장하는 공간이지만, scanf는 주소가 필요해서 그 변수의 주소를 전달해야 한다. 포인터와 배열은 이미 주소를 가지고 있으므로 따로 &를 사용하지 않는 것이다.



profile
사용자 경험 향상과 지속적인 성장을 추구하는 프론트엔드 개발자 ʚȉɞ

0개의 댓글