• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

printf 에서는 왜 & 를 사용하지 않는 것인가요?

21.05.13 13:29 작성 조회수 818

0

안녕하세요,

scanf 에서는 메모리의 주소에 접근해서 입력값을 넣어줘야 하기 때문에 & 를 사용한다고 하셨는데

그렇다면 printf 에서는 어떻게 & 를 사용하지 않고, 그냥 변수명만 넣어줘도 컴퓨터가 값을 가져올 수 있는 것인가요?

원리가 궁금해서 질문 남겨놓습니다.

답변 3

·

답변을 작성해보세요.

7

안소님의 프로필

안소

2021.05.13

이 부분은 나중에 포인터 배우실 때 이해하게 되실거라고 생각합니다!

그리고 또 나중에 배우실 call by value, call by reference 개념을 아셔야 이해하실 수 있어요. 함수 개념도 아셔야 하구요..!

그래도 간단히 설명 드리자면..

변수 앞에 & 가 붙으면 그 변수의 주소를 나타냅니다. 집 주소같이 그 변수의 메모리 주소를 뜻합니다.

scanf 는 파라미터로 넘겨준 변수에 어떤 입력을 받아서 그 변수에 값으로 넣는게 목적인 함수죠. 그러려면 그 변수 "원본"에 접근하여 그 변수의 값을 scanf 입력 값으로 넣어주어야 합니다. 즉, 변수 원본을 입력값으로 바꿔주는게 목적인 함수입니다. 그래서 그 변수의 주소를 넘겨주는 것입니다. 변수 원본의 값을 변경해주기 위해서에요. 이렇게 함수에게 변수의 주소를 넘겨 해당 변수 원본을 변경시키는 것이 바로 call by reference 개념입니다. 

scanf 에 파라미터 변수를 넘길 때 만약 & 을 안붙였다고 가정해봅시다. 그럼 이 변수의 원본을 넘기는 것이 아닌, 변수의 값만 복사해서 넘기는 것이에요. 그렇기 때문에 입력 받고자하는 "원본" 변수엔 아무것도 입력되지 못합니다. 예를 들어 func(int n) 이라는 함수가 있다면, func(a) 이렇게 func 라는 함수에 a 라는 변수를 파라미터로 넘겨서 호출시켰다고 가정해보겠습니다.  func 는 원본 a 변수를 가지고 조작하지 않고 a 의 값을 단순 복사한 후 이를 매개변수 n 에 대입합니다. 그리고 n 으로 함수 작업을 하죠! 즉, n 은 a 의 사본이 되는 것입니다. 즉, a와 값은 같지만 a 와 동일하지는 않은 변수에요.(완전 별개인 다른 존재) n = n + 1 이런식으로 n 값을 바꿔주어도 a 엔 전혀 a + 1 되지 않는다는 의미입니다. scanf 에 변수를 넘길때 & 을 붙이지 않고 넘긴다면 이렇게 해당 변수 원본을 넘기지 않고 변수 값만 복사한 사본을 넘기겠다는 것이나 마찬가지이니 원본 변수에는 아무것도 입력되지 못하게 됩니다. scanf 함수에 파라미터를 넘길때 & 을 붙여주는 이유입니다. 이러한 개념은 call by value 입니다.

이해가 안되셔도 괜찮아요! 나중에 배웁니다. 

printf 함수는 이와 달리 딱히 "원본"을 출력할 필요는 없습니다. 그냥 그 원본의 값의 사본을 출력해도 결과는 똑같아요. 만약 n 이 a 의 사본이라면, a 를 출력한 결과나 n 을 출력한 결과나 같겠죠. 두 변수의 값은 같으니까요. 그래서 printf 는 & 가 필요없습니다. 즉, 원본의 주소를 넘겨줄 필요가 없습니다. call by value  로도 출력하는데 아무 지장이 없기 때문입니다.

제가 설명드린 위와 같은 이유로  scanf 는 변수의 주소를 받도록, printf 는 단순 변수의 값을 받도록 그렇게 설계가 되있는 것 뿐입니다. ㅎㅎ

0

이종민님의 프로필

이종민

2022.12.31

자세한 답변 감사합니다.

0

고슴도치님의 프로필

고슴도치

2021.05.13

감사합니다! 덕분에 이해 잘 되었습니다!