C언어 포인터에 대한 이해(1)

C언어를 사용하게되면 포인터에 대한 이해가 필수입니다. 그래서 천천히 정리도 할겸 글을 씁니다.

 

그전에 포인터를 그냥 공부하기보단 왜 포인터가 필요한가를 느껴야지 더 와닿지 않을까 생각합니다.

 

저도 한동한 손을 놓고 있던지라 생각나는대로 정리를 하겠습니다.

 

포인터는 정말 유용한 도구인데요, 우선 포인터의 정의를 알아야 하겠습니다.

 

포인터는 번지값을 가지는 변수입니다.

 

Type *P;

여기서 *는 포인터 변수를 선언하는 구두점입니다.

Type은 포인터 변수가 가리키는 주소에 선언된 변수의 타입을 나타냅니다.

포인터변수는 주소값만을 취하기때문에 포인터변수의 크기는 항상 4byte로 일정합니다.(여기서 4byte는 32비트시스템에 해당함)

 

 

번지값을 갖는것은 의미가 참 큽니다.

 

그림으로 생각해야 이해가 쉬우니 그림을 한번 그려보겠습니다.

 

간략하게 그려본 메모리상에 주소입니다. 값의 경우는 타입의 크기에따라서 차지하는 범위가 달라지겠죠.

 

위 그림은 단순히 1바이트 char 자료형이라 생각하면 좋겠네요.A값을 갖구요.

 

이부분은 다들 아시리라 생각하겠습니다.(모르신다면 요청하시면 추후 올리겠습니다.)

 

변수는 위 그림에 표시는안했는데, K라고 하죠, 그럼 코드로 표현하면 이렇습니다.

 

char K = 'A';

 

이젠 포인터에대한 그림을 그릴껀데 char 형말고 int형으로 하겠습니다.

(여기 표시된 주소값의 간격은 1바이트이고 주소들은 임의의 수임)

 

포인터는 주소값을 갖는 변수인데 그 주소값은 자신의 주소값이 아닌 대상체의 주소값입니다.

 

자신의 주소값은 위 그림처럼 5212인 포인터 P가 있습니다.

(헷갈려 하시는분들이 있으실 것 같아서 아주 상세히 스펙을  말하자면 자신의 주소값은 5212인 4byte크기의 포인터변수 P입니다. 이해가 가셨나요?)

변수 B의 주소값 1235를 가리킵니다.

 

위 그림을 코드로 나타내면 다음과같습니다.

int B = 39;

int *P = &B; //포인터의 타입은 대상체(B)의 타입입니다.

쉽습니다.

 

만약 B가 double 형 변수라면 B의 주소값을 가리키기 위해선 포인터형도 double가 되어야합니다.

포인터변수가 대상체의 타입으로 선언되어야하는 이유는 포인터가 대상체의 주소와 대상체의 크기

두가지를 알고있어야지 제대로 된 참조가 가능하기때문입니다. 달랑 주소값만 갖는 포인터는 대상체의

타입을 모르기때문에, 주소값으로부터 몇 Byte를 읽어야할지 모르게됩니다.

그렇기때문에 포인터는 대상체의 타입을 자신의 타입으로 갖습니다. 어짜피 포인터는 주소값을 갖기때문에 포인터의

내용의 크기는 4Byte(운영체제때라다름)로 일정하기 때문이죠.

 

혹 나중에 void형 포인터를 보게될 것입니다. void는 타입을 정하지 않음을 뜻합니다. 이경우는 캐스팅을 해줘야합니다.

void도 유용하기때문에 사용하는데 포인터와 함수에만 사용가능하고 일반적인 변수는 사용하지 않습니다.

우선 void형은 신경쓰지 않으셔도 됩니다.

 

위코드에서

printf("%d\n", p);

printf("%d", *p);

이렇게 두가지를 해보시면 각각 주소값과 39라는 값이 나올겁니다.

여기서 *는 연산자입니다.

선언시의 '*'는 구두점, 사용시에는 연산자인것을 혼동하지 마시길 바랍니다.

*연산자는 포인터 변수가 가리키는 주소의 (내용)값을 나타냅니다.

여기까지 일반적인 포인터 변수의 기본적 내용이었습니다.

 

2014/01/12 - [프로그래밍/C언어] - C언어 포인터에 대한 이해(2)

 

나중에 call by value와 call by reference에 대해서 배우실 텐데 call by reference가 바로 포인터를 이용한 값의 참조입니다.

이렇게 함수의 인자로 포인터를 이용한 값을 참조해서 연산을 하게된다면 포인터가 참조하는 변수의 값을

함수내에서 변화시킬 수 있습니다. 함수의 특성상 포인터가아닌 단순히 변수를 인자로 받게된다면 죽어다 깨나도 변수의 값은 바꿀수 없습니다.

이 댓글을 비밀 댓글로