[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)는 메모리를 이용해 하드웨어 관리나 스케쥴링을 하는데
포인터는 이런 메모리 데이터에 접근할 수 있는 것이다.
= 하드웨어의 접근
과 같은 말이다.
물론 물리적 메모리가 아닌 가상 메모리 상에서의 이야기이다.
이 부분은 좀 더 조사가 필요할 것 같다.
다음 포스팅은...
소켓 프로그래밍을 건드려보자!
'프로그래밍 > 코딩(C & SOCKET)' 카테고리의 다른 글
[180508] Fast Change Directory (0) | 2018.05.08 |
---|---|
[151101] Raw Socket (0) | 2015.11.01 |
[151025] 리눅스 디스크립터 (0) | 2015.10.25 |
[150909] 리눅스 기반 채팅 chat_sv.c - 1 (0) | 2015.09.09 |
[150906] 리눅스 C언어 소켓 프로그래밍 (1) | 2015.09.06 |