본문 바로가기
Language_/C 언어

[C언어] scanf()함수에서 &(ampersand)를 쓰는 이유

by 낭람_ 2019. 1. 21.
반응형

[&(ampersand)에 대하여]


c언어를 시작하면 printf에서는 &를 안썼는데, scanf에서는 &를 쓸때가 있고, 안쓸때가 있다.

&의 역할은 무엇이며, &는 언제 쓰는 것일까.


&(ampersand)의 역할

- &(ampersand(앰퍼샌드))는 해당 변수의 주소를 가리키는 역할을 한다.

- &를 이해할려면 주소에 대한 개념을 알아야 한다.

주소     값

000      32

001      20     <얘가 변수 a

002      23

003      13

만약 변수 a의 값이 20 이고, 001에 저장되어 있다면

연산     값

&a      001

위 처럼 된다. 즉, &는 변수가 어디에 저장되어 있는지를 나타낸다.


      

&가 해당 변수의 주소를 가리키는 역할을 하는데 왜 scanf 함수에서 쓰일까?

scanf("%d", &a);

- scanf를 사용할 때 내부적으로 구동되는 방식은

  1. 값을 입력받는다.

  2. 그 값을 레지스터에 임시로 저장하고 *레지스터란 임시의 저장공간이라 생각하면 된다.

  3. 변수의 주소로 찾아가 그 주소가 가리키는 메모리에 레지스터에 있는 값(입력한 값)을 저장한다.

  4. 레지스터에 있던 값은 지운다.

- 즉, 값을 입력하려면 변수의 주소가 필요하기 때문에 &를 써야한다.

int a;
char b[20];
scanf("%d", &a); //&를 써야한다.
scanf("%s", b); //&를 안써도 된다. b 자체가 주소

- 여기서 만약 문자열(%s)을 집어넣을 경우엔 문자열 자체(변수가 포인터거나 배열 일때)는 주소이므로 안써도 된다.



call by reference 와 call by value의 차이를 생각하면 이해하기 쉽다.

- call by reference를 해야 변수의 값을 바꿀수가 있다.

- call by value

#include<stdio.h> //call by value

void change(int );

int main() {
int a = 5;
printf("before change [a] : %d",a);
change(a);
printf("after change [a] : %d",a);
}

void change(int a){
a = 10;
}


- call by reference

#include<stdio.h> //call by reference

void change(int *);

int main() {
int a = 5;
printf("before change [a] : %d\n", a);
change(&a);
printf("after change [a] : %d\n", a);
return 0;
}

void change(int *a) {
*a = 10;
}

- 함수에 &를 써줘야 그 값을 변경할 수 있다.





반응형

댓글