본문 바로가기

프로그래밍/C언어

[C언어] 포인터(2) - 포인터의 형변환

안녕하세요 ! 초보개발자 입니다. 

이 블로그는 개인 공부 정리용 블로그 입니다. 

혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.

그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.

그럼 시작하도록 하겠습니다.




1.포인터(2)


1)포인터의 형변환


포인터의 타입도 변수처럼 형변환이 가능합니다. 포인터의 타입이 의미하는 것은 얼마만큼의 데이터를 읽어 오는지에 대한것이며 포인터 타입이 형변환이 되면 읽어올 데이터의 양과 해석방법이 달라질뿐 저장된 값에는 아무런 영향을 미치지 않습니다.


단계별로 포인터 타입간의 형변환을 살펴보도록 하겠습니다. 


(1) 변수 i의 주소를 포인터pi에 저장을 합니다.(i의 주소값은 0x100이라고 가정하였습니다.)

int i =0x1B2B3B4B;

int *pi = &i;



(2) 포인터 pi의 값을 포인터 pc에 저장 합니다. pi와 pc의 타입은 다르므로 형변환이 필요 합니다.


char *pc = (char*)pi;



이제 pi 뿐만아니라 pc에서도 변수 i에 접근을 할 수 있습니다. 하지만 두 포인터 변수의 타입이 다르기 떄문에 *연산자를 이용하여 읽어오는 데이터의 값은 다릅니다. pi는 int 형이기 떄문에 4byte를 읽지만 pc는 char형이기 떄문에 1byte를 읽습니다. pi를 출력하면 1B2B3B4B 의 4byte를 읽어오지만 pc를 읽어오면 1B 의 1byte만 읽어 오게 됩니다. 이처럼 char*타입의 포인터를 이용하면 해당주소에서 데이터를 1byte씩 읽어오는 것이 가능합니다.


2) 포인터의 포인터


포인터도 변수이기 때문에 포인터가 포인터를 가르키는 것도 가능합니다. 이를 더블 포인터라고 합니다. 포인터의 타입은 포인터가 가리키는 대상의 타입에 *기호를 추가한 것이므로 만일 포인터 pi의 타입이 int *이라면 포인터 pi를 가리키는 포인터의 타입은 int ** 이 될 것입니다.


int i =1;

int *pi = &i;

int **ppi=π


int **ppi=&pi; < 더블포인터의 표현 방식 입니다.



더블 포인터 ppi를 이용하여 *연산자를 이용해 pi의 값 0x100 뿐만 아니라 변수 i의 값 1까지 접근을 할 수 있습니다.


오늘의 강의는 여기서 마치겠습니다. 다음시간에도 포인터를 이어서 진행하도록 하겠습니다.