Computer Language/C

포인터의 개념과 메모리 할당과정의 이해1 [기본]

짠백이 2018. 8. 15. 22:58
반응형




오늘은 C언어에서 중요한 개념중에 하나인 포인터(pointer)에 대해서 포스팅 하려고합니다.



그리고 더불어서 변수와 포인터의 메모리(memory) 할당과정도 함께 알아보겠습니다. 



pointer

(사전적 정의 : 가리키는 것)




포인터의 사전적 정의는 '가리키는 것' 입니다. 그렇다면 과연 무엇을 가리키는 걸까요?


포인터는 주소 값을 저장하는 변수입니다. 


그리고 저장된 주소 값을 참고하여 다른 메모리(변수 또는 객체(?))에 접근하는것이며,


이것을 비유적으로 '가리키다' 라고 표현한 것입니다.





(개인적으로는 '포인터'라는 용어보다 변수라는것을 직관적으로 파악 할 수 있는 '포인터 변수'라는 


용어를 선호하기 때문에 앞으로 포인터 변수라고 하겠습니다.ㅎ)







포인터 변수를 사용하는 이유는 무엇일까요?


포인터 변수를 사용하는 이유는 코딩과 유지보수의 효율 때문이라고 생각합니다.


특정 메모리에 접근 할 때 사실 포인터 변수를 사용하지 않더라도 주소값을 참조하여 접근이 가능합니다.


하지만 개발자의 입장에서는 주소값보다 포인터 변수(=이름)으로 접근하는것이 코드의 


가독성이 향상되기 때문에 코딩 유지보수의 효율이 높아집니다.



마치 웹에서 외우기 어려운 IP주소 대신 도메인 네임을 사용하는 것과 유사합니다.


(ex)   210.89.164.90 -> naver.com)





그럼 예제 소스와 이미지를 통해서 포인터 변수와 변수의 메모리 할당방식에 대해 확인해보겠습니다.


먼저 소스코드에서 x라는 int형 변수를 선언하고 '13' 을 저장하였고, xp라는 int* 형 포인터 변수를 선언하고 


변수 x의 주소값(&x)을 저장하였습니다.



[Source]





그리고 해당 소스를 컴파일해서 프로그램을 실행시키면 컴파일러에 의해서 아래와 같은 


심볼 테이블(symbol table) 이 생성됩니다. 


[Symbol Table]



심볼 테이블은 메모리의 전체 영역 중에서 변수를 수훨하게 찾기위해 

변수 이름과 저장 가능한 데이터 타입 그리고 메모리 주소값을 저장해 놓은 테이블입니다.

그리고 이 심볼 테이블의 값은 변수가 소멸될때까지 유지됩니다.





변수 x와 포인터 변수 xp의 논리적인 구조는 아래와 같습니다.


[논리적 구조]



포인터 변수 xp에 변수x의 주소 값인 0x0012FF44가 저장되어 있음으로, 

포인터 변수 xp는 변수 x를 가리키고 있는 것입니다.






그리고 마지막으로 실제로 메모리에 저장되는 구조는 아래와 같습니다.


[메모리 구조]



변수 x는 int형으로 선언되었기 때문에 각 4byte의 메모리 공간이 할당되며,


포인터 변수 xp는 선언하는 데이터 타입과 별개로 4byte로 메모리 공간이 할당됩니다.




( * 포인터 변수의 메모리 공간의 할당은 선언시의 지정한 타입이 아닌 

컴파일러에 따라서 결정됩니다. )







다음 포스팅에서는 조금 더 구체적인 변수와 포인터 변수의 


메모리 할당 과정에 대하여 포스팅 하겠습니다.








포인터의 개념과 메모리 할당과정의 이해2 [심화] : http://solt.tistory.com/8?category=795285



최대한 정확한 정보를 공유하고자 항상 신중하게 포스팅을 하고 있지만, 

내용에 개선이 필요한 부분이 있을 수 도 있습니다.

혹시나 추가적인 보완이 필요하다고 판단되는 부분이 있다면 댓글로 조언해주세요. 

참고하여 수정해놓겠습니다.



* 해당 포스팅이 도움이되셨다면 공감과 댓글 부탁드릴께요 ㅎㅎ




반응형