본문 바로가기

Programming/C, C++

포인터의 포인터

C에서는 다른 언어와는 달리 문자열이라는 데이터형이 없다.

 

대신 C에서는 char형의 포인터로 문자열을 나타낸다. 다음의 예를 보자.

 

char str1[] = "This is string.";

char *str2 = "This also is string.";

 

위의 str1은 배열의 형식으로 str2는 포인터의 형식으로 문자열을 나타내었지만 두 형식은 비슷한 의미를 지니고 있다.

 

다른점이 있다면 str1은 배열의 이름이기 때문에 자체의 주소를 저장하기 위한 공간을 갖지 않는 상수라는 것이다.

 

반면에 str2는 포인터이기 때문에 주소를 저장하기 위한 공간을 할당받는다.

 

그러므로 내용인 주소값을 얼마든지 변경이 가능하다. 이 점만 재외하면 포인터와 배열은 마치 동일한 것으로 취급해도 된다.

 

 ""는 사이에 있는 문자열을 정적 데이터 영역에 저장하며 = 연산자와 쓰일때는 그 선두 번지를 의미한다.

 

그래서 str1은 그 정적 데이터 영역의 선두 번지를 나타내는 상수이며,

 

str2는 포인터이므로 정적 데이터 영역의 선두 번지가 포인터 변수에 대입된다. 문자열의 끝은 NULL로 나타냄도 다 알고 있을 것이다.

 

결론적으로 C에서는 문자열을 가리킬때는 char형의 포인터가 사용되어야 한다는 것을 알아두자.

 

그렇다면 문자열의 배열은 어떻게 될까? 문자열의 배열에는 두 가지의 형이 있다.

 

하나는 정방형의 배여이고, 다른 하나는 들쭉날쭉한 모양의 배열이다. 여기서는 들쭉날쭉한 모양의 문자열 배열을 보기로 하자.

 

char **strarray = {"Cat", "Dog", "Lion", "Rat"};

 

위늬 strarray앞에는 별이 두 개 붙었다. 이것이 바로 포인터의 포인터의 정의 방법인데 그 내용으로는 문자열들의 나열이다.

 

이것들이 어떻게 메모리를 차지하는지를 알면 왜 포인터의 포인터가 사용되는지 알 수 있을 것이다.

 

다음 그림에서 사용한 주소들은 편의상 임의로 붙인 주소이다.

 

 

Cat, Dog... 등과 같은 문자열들은 10이라는 주소부터 차곡차곡 저장되어 있으며 각각은 NULL문자(\0)으로 구분되어 있다.

 

그리고 각 문자열의 선두 번지(즉 포인터)는 30이라는 주소부터 연속적으로 저장이 되어 있다.

 

즉, 30부터의 내용은 포인터의 배열이 되는 것이다.

 

이 포인터의 배열의 선두 번지를 가리킬 strarray는 30이라는 주소를 가지며 이 30은 10을 가리키는 포인터이다.

 

즉 strarray는 포인터를 가리키는 포인터인 것이다.

'Programming > C, C++' 카테고리의 다른 글

배열  (0) 2017.12.11
데이터형에 관계없는 swap() 함수  (0) 2017.12.11
void포인터, 함수 포인터  (0) 2017.12.11
포인터 연산자  (0) 2017.12.11
최적화에 대하여...  (0) 2017.12.11