[&(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;
}
- 함수에 &를 써줘야 그 값을 변경할 수 있다.
'Language_ > C 언어' 카테고리의 다른 글
[c언어] memset 함수에 대하여 (0) | 2018.11.24 |
---|---|
[c언어] ctype.h 함수 목록 (0) | 2018.10.31 |
[c언어] scanf와 scanf_s의 차이 (2) | 2018.10.10 |
[c언어] Visual Studio 콘솔창 유지 (0) | 2018.10.06 |
[c언어] Visual Studio 2017 설치하기 (0) | 2018.10.05 |
댓글