printf 에서는 왜 & 를 사용하지 않는 것인가요?
1235
작성자 없음
작성한 질문수 0
안녕하세요,
scanf 에서는 메모리의 주소에 접근해서 입력값을 넣어줘야 하기 때문에 & 를 사용한다고 하셨는데
그렇다면 printf 에서는 어떻게 & 를 사용하지 않고, 그냥 변수명만 넣어줘도 컴퓨터가 값을 가져올 수 있는 것인가요?
원리가 궁금해서 질문 남겨놓습니다.
답변 3
7
이 부분은 나중에 포인터 배우실 때 이해하게 되실거라고 생각합니다!
그리고 또 나중에 배우실 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 는 단순 변수의 값을 받도록 그렇게 설계가 되있는 것 뿐입니다. ㅎㅎ
Export template 안됨
1
61
2
완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.
1
86
3
main 함수에서 왜 int만 선언이 되는걸까요
1
78
2
8비트 2진수 변환시 왜 1을 더해야하나요?
1
73
2
혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?
1
75
1
프로토타입과 함수간의 인자 불일치
1
86
2
12.12 헤더 관련 질문
1
74
2
Visual Studio Community 2026 사용 문의
1
164
2
Q. 15:30, 부호가 있는 8비트 정수 질문
1
71
2
getchar(), putchar()
1
109
3
강의자리ㅛ
1
92
2
비주얼스튜디오코드로 공부해도 상관없나요?
1
127
2
소스파일안에 여러 파일
1
85
2
F5와 F7의 차이
1
90
2
c = TWO * (a+b); 에서 a와 b는?
1
67
2
; 세미콜론을 붙이는 기준에 문의
1
78
1
Step over 기능 문의
1
63
2
2.6 강의 따옴표 출력 규칙 문의
1
86
2
int main 함수 관련 오류 문의
1
75
2
13.4 words[0]
0
73
2
11.7 함수를 구현해 봤습니다.
1
67
2
11.6 직접 strcmp와 strncmp를 구현해 보았습니다.
1
71
2
11.6 my_strcat과 my_strncat을 구현해봤습니다.
1
60
2
11.6 fit_str함수를 구현해 봤습니다.
1
58
2





