본문 바로가기

프로그래밍/코딩(C & SOCKET)

[150903] C언어 포인터 기초 개념

반응형

[150903] C언어 포인터 기초 개념


포스팅을 안한지 무려 11일이 흘렀다(...)

마지막 포스팅 후 휴가를 갔다오고, 개강 준비를 위해서 그랬다고 자기 합리화 해본다...


학과 강의 중에 C언어를 배우게 됐다.


Network 프로그래밍 언어가 다양해서 뭘 골라야 할까 고민하던 중이었는데,


마침 C언어를 배운다고하고..


잘 생각해보면 C언어 특성상 소켓 프로그래밍과 잘 어울릴 것 같다는 느낌도 든다.

순전히 감이지만..


어쨌든 오늘 포스팅에서는 C언어에서 상당히 비중있게 다뤄지는


포인터(Pointer)


를 아주 가볍게 알아보자.





아, 그전에 컴퓨터에서 사용하는 메모리(Memory)에 대한 개념이 필요하다.




운영체제(OS)를 알고있다면 32bit, 64bit 와 같은 숫자를 들어본 적이 있을텐데, 이 숫자들이 의미하는 바는 무엇일까?


한 번 읽고 쓸 때 처리하는 용량을 의미한다.


또, 이 용량을 Word 라고 부른다.


그리고 이 bit는 CPU에 꽂히는 핀(pin)의 개수와도 같다.



예를 들어, 32bit 운영체제는 32bit = word 라고 정의할 수 있다.


"정리하자면, 특정 연산을 처리할 때(read & write) , 프로세서는 32비트씩 데이터를 (word) 보냄을 의미한다."


참고로 32bit 는 4Byte와 같다.



그러면, 그림으로 표현하면 아래와 같다.




0

1

2

3

 -> 0x00000000

4

5

6

7

 -> 0x00000004

.

.

.

.

 

 .

 .

 .

 .

 

 .

 .

.

 .

 

( 2^32)-4

( 2^32)-3

( 2^32)-2

( 2^32)-1

 -> f f f f f f f c


[32bit OS 환경에서의 메모리]


메모리 용량이 커져감에 따라서 십진수로 주소를 표현하기에는 가독성과 효율성이 떨어지기 때문에


주소체계를 표현할 때는 16진수를 사용한다. (위의 각 주소는 메모리 줄의 첫 번째 주소를 가리킨다.)



대충 메모리에 대한 개념이 자리잡혔으면, 포인터에 대한 이해를 해보자.


포인터(Pointer)는 직역하면 지시자, 가리키다 등의 뜻을 가지고 있는데,


그 이유는 포인터가 특정 메모리의 주소를 가리키기 때문이다.


포인터는 포인터 이름 앞에  * 을 붙여서 구분한다.


가령 변수 A를 선언할 때는


int A;


라고 선언하지만, 포인터 P의 경우는


int *P;


라고 해줘야만 제대로 선언이 이루어진다.


이렇게 선언한 포인터에는 변수나 배열 등의 주소가 들어갈 수 있는데,


가령 *P = A; 라고 하면



조금 지저분하게 나왔지만, 가장 아랫줄에


 a : 4 / &a(a의주소) : 0xbfc2a8f8 / *p(포인터에 담긴 주소) : 0xbfc2a8f8


라고 쓰여진걸 볼 수 있다.


아니, 한 곳에 똑같은 걸 담아놓고 출력이 같게된다고 하면 그게 무슨 소용이 있겠느냐


라고 질문할 수도 있지만, 그렇다면 이 다음 배열을 보자.






코드는 위에서 참조하면 된다.




보이는 결과값에 주목해보자.

변수 var1의 첫 번째 주소 : 10 (0xbfaf559c)

(주소가 아니라 값이라고 해야 자연스러운데.. 어쨌든 넘어가자.)


포인터 p가 var1의 첫 번째 원소를 가리킨다 : 0xbfaf559c

배열의 주소와 포인터의 값이 같다는 것을 확인할 수 있다.


이렇게 포인터는 배열의 원소에도 접근할 수 있다.


그런데, 여기까지도 좀 애매하게 생각할 수 있다.


아직까지 필요성을 잘 못느끼겠다.



이 후부터가 포인터의 진가라고 할 수 있는데, 아쉽게도 아직 자세히 배우지 못했다. (ㅠㅠ)


간단하게 훑어 보자면 이런 맥락이다.


"메모리에 접근할 수 있다"


라는 말을 그냥 지나칠 수 있지만, 컴퓨터에게 메모리란 아주 중요한 개념이다.


보통 운영체제(OS)는 메모리를 이용해 하드웨어 관리나 스케쥴링을 하는데


포인터는 이런 메모리 데이터에 접근할 수 있는 것이다.


= 하드웨어의 접근


과 같은 말이다.


물론 물리적 메모리가 아닌 가상 메모리 상에서의 이야기이다.


이 부분은 좀 더 조사가 필요할 것 같다.


다음 포스팅은...


소켓 프로그래밍을 건드려보자!





반응형