c언어 포인터 변수 : 주솟값을 저장한다.

코딩/C 2019. 10. 11. 18:46

 개인적인 생각이지만, C언어에서 포인터는 반드시 알고 가야 할 키워드 중 하나인 듯 싶습니다. ps에서 그렇게 많이 사용하지는 않았는데, 상당히 중요한 부분을 차지하고 있기도 하고, 심지어 어느 교재에서는 이것만을 중점적으로 다루는 책도 있을 정도이니 말을 다 한 셈입니다.

 

 오늘 배울 것은 주솟값을 얻어오는 &와, 역참조를 하는 *만 배워볼 겁니다. 사실 이것만 제대로 익혀도 포인터의 50% 이상은 정복했다고 봐도 과언이 아니기 때문입니다.

 

 


 예제 두 개만 봅시다.

 

 

 뭔가 복잡해 보입니다? 하나 하나 천천히 봅시다. 먼저 int 형 변수 a를 선언했습니다. 그러면 메모리 상에는 다음과 같이 그려질 겁니다. 아래 그림을 보면, 0x80번지에 a가 할당되어 있음을 알 수 있는데요.

 

 

 그러면, 0x80번지에 a를 위한 공간이 할당되었고, 여기에는 10이라는 값이 저장되어 있다고 볼 수 있겠군요. 그러면, &a는 어떤 값이 될까요? a의 address니까, 0x80이 될 겁니다.

 

 

 그런가요? 네. &a는 0x80입니다. 5번째 줄에 int *p = &a; 는 무엇을 의미할까요? 일단, &a는 0x80이니까, p에다가, 그 값을 넣겠다는 것을 의미해요. 그러면 이 때, 0x80은 a의 주솟값인가요? 주솟값을 저장하는 변수를 우리는 포인터 변수라고 이야기를 합니다.

 

 

 여기까지 이해가 되시나요? 조금 길었는데요. int *p는 p가 어떤 값을 저장한다고 했나요? 주솟값. 이를 우리는 pointer varible이라고 했습니다. 다음에 변수명 앞에 &를 붙인 것은 무엇이라 했나요? 예를 들어서, &a는 a의 주소를 얻어옵니다. 이 두 사실을 기억하시면서, 6번째 줄을 해석해 봅시다.

 

 


 (*p) = 20; 이라고 했는데요. 일단 (*p)의 의미를 봅시다. p가 주솟값을 저장하고 있다면, 주솟값에 있는 실제 위치에 접근합니다. 아래 그림을 봅시다. 0x80은 a가 할당이 되어 있어요. 그렇기 때문에, a에 접근을 합니다.

 

 

 그러면 (*p) = 20; 은 무엇을 의미할까요? 0x80 번지에 할당되어 있는 변수는 a이기 때문에, a에 접근을 하라는 건데요. 결론적으로 (0x80)번지의 값을 20으로 바꾸라는 겁니다. a의 값이 20으로 바뀝니다.

 

 

 그 다음에 a값을 출력하면 어떤 값이 출력될까요? 20이 출력됩니다. 우리는 0x80에 이동해서, 메모리의 값을 썼어요.

 

 


 하나만 더 봅시다.

 

 이 프로그램의 실행 결과는 어떻게 나올까요?

 

 

 아까와 같이 생각한다면, 메모리는 다음과 같이 그려질 겁니다. b가 0x90번지에 할당이 되었다면, q는 0x90일 거고, a가 0x80에 할당되었다면 p는 0x80일 겁니다. p가 a를 가리키고 있고, q가 b를 가리키고 있는 그림이 그려집니다. 그러면 (*p)의 값과 (*q)의 값을 어떻게 구해야 할까요? (*p)부터 봅시다.

 

 

 먼저 p의 값은 0x80입니다. 그러면 (*p)의 의미는 0x80번지에 가서, 이 위치에 접근하라는 의미입니다. 그러면, (*p)의 값은, 10입니다. 그러면 (*q)는 무엇일까요?

 

 

 

 q가 0x90이니까, *q는 0x90번지에 있는, 실값인 20을 얻어오라는 의미가 됩니다. 우리는 주솟값을 통해서, 실제 값을 얻어오기도 하고, 참조도 하고 있어요. * 과 & 연산자는 앞으로 포인터 변수 이야기 하면서 상당히 많이 나오기 때문에, 두 예제를 완벽하게 이해하시는 게 무엇보다 중요할 듯 싶네요.