프로그래밍/C언어

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

콘파냐 2014. 1. 12. 22:00

저번 포스팅에 이어 포인터에 대해 쓰려합니다.

저번 포스팅은 포인터의 가장 기본이 되는 사항을 체크해 봤습니다.

이번 포스팅은 주제를 좀 더 세분화하여 심화해 보겠습니다.

 

포인터의 타입의 의미

2013/11/28 - [프로그래밍/C언어] - C언어 포인터에 대한 이해(1) 에서 타입이 왜 필요한지 스치 듯 설명했습니다.

 

포인터의 타입은 포인터가 가리키는 대상체의 타입입니다.

간단하게 예를 들어 보겠습니다.

 

c언어포인터

p포인터는 arr배열을 가리키기 위해서 int형으로 선언되어 있습니다.

배열을 잘 모르시는 분을위해 간략한 설명을 하겠습니다.

참고 :

2013/05/25 - [프로그래밍/C언어] - 배열의 특징 C언어

arr[10] 에서 arr은 배열명으로서 arr[0]의 주소값을 의미하고, 배열 전체를 대표하는 배열명(sizeof 연산자의 사용시)인동시에 상수포인터(0번째요소의 주소값을 가지는 포인터)입니다.

그래서 p=arr 은 arr[0]의 번지를 p포인터로 가리킨다는 뜻입니다.(*p=arr[0])

그리고 다음 줄 p+3은 포인터의 +연산입니다. 보통 배열에선 이런식으로 배열의 요소를 나타내는데, p+3은 p를 기준으로 +3번째 요소를 말하는겁니다. *p는 arr[0]과 같으므로 *(p+3)은 arr[0+3]과 같은 의미가 됩니다.

만약 여기까지 이해를 했다면, 한번 깊게 생각해봐야할 것이 있습니다.

int a=0;

a++;

여기서 a는 1이 증가가 당연히 됩니다. 우리가 지금까지 알고 있는 증감연산자는 1이라는 수가 더해지고 빼지고 합니다.

그럼 포인터의 경우를 생각해 보죠.

위 코드에서 p+3대신 p++를 넣어보면 어떨지 생각해 봅시다. 그럼 p(0번째요소)에서 1이 증가하니 p+1과 같은 코드겠죠?

그래서 두번째 요소의 값 2가 출력 되죠.

하지만 원리는 그리 간단하지 않습니다. p가 가르키는 arr[0]에서 arr[1]까지 간격은 int형 배열이므로 4바이트가 됩니다.

4byte가 더해졌네요.

만약 int 형이 아닌 float 형이나 double 형이라면 8바이트가 더해져야 2번째 요소를 정확하게 가리킬 것입니다.

그리고 같은 8 바이트라도 float형과 double형의 비트처리방식이 다르겠죠?  

이것이 포인터를 선언할때 대상체의 타입으로 선언하는 이유입니다. 그래야 포인터가 가리키는 주소로부터 몇 바이트를 어떤식으로 처리할 것인가를 결정할 수 있는 겁니다.

 

대상체에 따른 포인터선언

대상체의 타입(int와 float의 차이)에 따라 포인터의 해석방식이 달라진다.

위에서 p+3의 작동방식에 대해서 언급했습니다. 대상체의 타입에 따라서 +3의 값이 다르게 작용해야 정확히 요소 요소를 연산을 통에 나타낼 수 있습니다.

 

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

다음 포스팅은  4칙연산에 대해 다뤄볼까합니다.

반응형