c++ Pointer #2

이글은  2004.01.28 http://cafe.naver.com/headstudy.cafe 에 쓴 글을 다시 긁어 온것입니다. 사실 포인터라는게 처음에는 좀어려워 보입니다만.. 익숙해지면 포인터만큼 편한게 없습니다. 포인터를 막(?) 사용하는 저로서는 C#으로 코딩할때 포인터가 없다는게 좀 아쉽더군요(물론 비슷..한건 있습니다만..)


문자열은 포인터입니다.

위의 글을 보고 조금 의아해 하는 사람이 있을 것입니다. 하지만 이 말은 틀린 말이 아니며 또한 중요한 부분이기도 합니다. 지금부터 설명하는 내용을 차근차근 읽어 나간다면 모두 어렵지 않게 이해할 수 있으리라 생각해요.
그러면 지금부터 본격적으로 설명을 해 보도록 합시다 우싸.

C의 문자열은 그 문자열의 시작 주소값을 나타내는 상수포인터의 표현입니다. 또한 C의 문자열은 문자열 끝에 문자열의 끝을 나타내는 특수문자 0을 넣어 관리됩니다. 0 은 제어 문자이므로, '\0' 처럼 표현하기도 해요. C에서 문자열의 끝에'\0'을 넣어 관리한다고 해서  '\0' 자체가 문자열에 포함되는 것은 아닙니다. 단지 문자열의 끝을 의미하는 표시로 사용될 뿐이죠.
다음과 같은 대입문에 대해서 생각을 해 voa요~




 

문자열은 그 문자열의 시작주소 값을 나타내는 상수포인터라고 하였으므로 pStr은 다음과 같이 선언되어야 할 것이다..






 

그렇다면 pStr에는 도대체 무슨 값이 들어가는가?
이쯤에서 '='(대입연산자) 의 연산순서에 대한 이야기를 먼저하죠. '='연산자의 실행순서는 연산자를 기준으로 오른쪽이 먼저 실행되고 그 다음 왼쪽이 실행됩니다. 즉 위의 pStr="Hello"; 는 오른쪽의 "Hello"; 가 실행되고 그 결과값을 pStr 에 대입합니다.

그렇다면 "Hello"; 가 실행된다는 의미는 무엇인가? 컴파일러는 문자열의 관리를 위해 미리 예약해 둔 특정 메모리 영역에 "Hello"+'\0' 을 차례대로 집어넣습니다. 즉 문자 5개("Hello")를 관리하기 위해 0 을 포함하여 6바이트를 사용하는 것입니다. 이와 같이 문자열의 저장이 완료되면('='연산자를 기준으로 오른쪽의 문장이 실행 완료되면) 저장된 영역의 가장 선두에 있는 주소 즉 'H' 가 저장되어 있는 곳의 주소가 pStr 에 저장되는 것입니다.
그러므로 pStr 은 위와 같이(char *pStr) 선언되어야 하는 것이죠.

일반적으로 문자열에 대한 이해가 부족한 사람은 pStr="Hello"; 라는 문장을 문자열 "Hello"를 pStr 에 대입한다... 라고 알고 있지만 그것은 잘못된 생각입니다

pStr="Hello"; 의 메모리 상태를 그림으로 표현한다면 다음과 같을 것입니다. 



 

이제부터 약간의 응용을 해 보아요. *(pStr+1)은 무엇을 의미할까요~? pStr이 2000번지이므로 [2001]* 를 의미합니다. 즉 문자 'e'에요. *(pStr+1)은 연산자 [](배열선언 연산자)를 사용하여, pStr[1]로 나타낼 수 있습니다. 다음을 기억하여 둡시다.

 

 

pStr과 n의 위치를 바꾸어 *(n+pStr)라고 쓸 수 있듯이, n[pStr]라고 쓸 수도 있습니다. 이와 같은 방법을 역첨자 방식이라고 합니다. 하지만 그리 많이 사용되는 방법은 아니므로 그저 이런 것이 있다는 정도로만 알아두기 바랍니다. 그러므로 pStr[1]은 1[pStr]이라고 쓸 수 있습니다. 아래것 한번 실행해 보세요~~



댓글

이 블로그의 인기 게시물

c# GDI+ 꺼져!! BufferedGraphics

c# 에서 C++ dll 사용하기

c# string 에서 mfc의 LPCTSTR간의 변환