포인터(`*`)는 주소값을 불러 온다고 알고 있습니다.
예를 들어 a가 100이라는 주소에 있으면,
```
int a, *pa;
pa=a;
printf("*pa = %d", *pa);
```
라고 했을 때, pa에 a의 주소값을 대입하여 a의 주소값을 불러오는 거라고 알고 있는데요. 제가 이걸 배우고나서 궁금증이 들었던 건.
이게 왜 필요한지. 싶었던 것입니다.
*pa를 사용해 a의 값을 불러온다.
그렇다면
```
int a = 10;
int *pa;
pa = &a;
```
라고 했을 때 pa의 값에 a의 값이 들어 있던 10을 포함시키는 거잖아요?
근데 그럴 거면 그냥
```
int pa = 10;
```
이라고 해도 되는데 왜 굳이 *을 쓰는 건가요? 굳이 저렇게 복잡하게 할 필요도 없이
```
int a = 10;
printf("a의 값 : %d", a);
```
라고 하는 게 훨씬 편하지 않나요?
제가 단순히 *문에 대한 이해도를 위해 공부를 했기 때문인지 솔직히 효율성을 크게 못느끼겠습니다..
## 요약
즉, 왜 굳이 이런 복잡한 방식의 *이라는 포인터를 사용하는 것이며,
구체적으로 쓰는 곳이 어디인지, 왜 사용하는지부터가 궁금하고,
제가 앞으로 c언어를 배우려면 이 녀석을 왜 쓰는지 알고 배우고 넘어가야 할 것 같기에 고수님들께 여쭙니다..
부탁드립니다.
sehongpark님의 답변
## 값의 복사: call by value
아래의 코드는 값이 복사가 됩니다.
```
// 값의 복사 - 사본생성
int a = 10;
int pa = a;
// a에 새로운 값을 대입
a = 100;
printf("%d", pa); // 10이 출력
```
## 값을 공유: call by reference
아래 코드는 값이 공유 됩니다.
```
// 포인터를 통한 공유 - 원본 공유
int a = 10;
int *pa = &a;
// a 값을 변경
a = 500;
printf("%d", *pa); // 500
```