이중포인터에 대한 이해 C언어

이중포인터에 앞서 필요한 개념을 간단히 설명하겠다. 변수는 메모리상에 데이터가 차지하는 공간을 대변한다. 이런 변수는 시작주소값이 존재하고 타입이 존재한다. 주소값과 타입을 알면 메모리 공간에서 변수를 해석할 수 있다. 이렇게 기본적인 지침을 설명하는 곳은 그리 흔치 않다.

 

포인터 타입의 행동특성

포인터의 개념은 실제로 너무도 단순 명확하다. 변수의 주소를 가리키는 또 다른 변수라 생각하면된다. 그래서 포인터라고도 하지만 포인터 '변수'라고도 불리운다. 주소를 가리킨다는 말은 실제로는 포인터는 대상체의 주소값을 지닌다는 말이다. 포인터의 동작은 이렇게 자신이 지닌 값, 즉 주소값을 '*'연산을 통해서 참조하는 특징을 한다. 즉 포인터 타입의 행동특성이다.

 

2013/11/28 - [프로그래밍/C언어] - C언어 포인터에 대한 이해(1)


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


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


이중 포인터란

그럼 포인터도 일종의 변수기 때문에, 포인터를 가리키는 포인터도 존재한다. 이를 이중 포인터라고 한다.

그런데 이런 이중 포인터의 선언 타입은 첫번째 포인터의 선언 타입을 따라간다. 결국 이중포인터도 최초의 변수 즉 최종 대상체가 되는 값의 타입을 기준으로 선언 되는 것이다. 왜냐면 포인터 자신의 타입은 포인터 타입(4byte)만 존재하기 때문에 자신의 타입 자체에 대해서는 신경 쓸 필요가 없기 때문이다.

 

위에 나온내용을 정확히 이해한다면 3중 4중 포인터도 같은 방식으로 이해하고 활용하면 된다.

 

이중 포인터의 선언 방법과 메모리 구조

이중포인터의 선언은 단순히 '*'을 한번 더 붙여 주면 된다.(이전 포인터에 대한 이해에서도 말했다 시피 선언시 '*'은 연산자가아니다.)

 

위 코드는 포인터와 이중포인터가 어떻게 동작하는지 간략하게 알려준다.

위 코드를 메모리 상에서 나타내보면 다음과 같다.

 

이중포인터

p2가 지닌 값은 p1의 주소이므로 포인터의 동작틍성에따라 '*'연산을 통해 자신이 지닌 값을 주소의 시작점으로 하는 p1을 참조한다. '*'연산을 통해 p1이 지닌값, 즉 a의 주소값을 알 수 있다. 같은 방식으로 **을 하면 p1이 지닌 a의 주소값을 참조하여 a의 값을 알 수 있다.



&연산자의 활용시 주의

반대의 경우 &를 통해서 자신의 주소값을 알 수 있지만, &&를 사용하지는 못한다. 이유는 &연산의 결과 값은 상수기 때문이다.

상수는 메모리의 공간을 나타내는 변수가 아니고, 단순히 값 그자체이기 때문에 C언어상에서는 위 그림과같은 위치적인 표현을 할 수 없기 때문이다. 이와 비슷한 예롤 캐스팅연산의 예를 들 수 있다. 캐스팅연산을 하면 그 연산을 한 수식내에선 캐스팅후의 값은 상수가 된다. 즉 캐스팅 연산자는 캐스팅을 하는 대상의 타입을 완전히 바꾸는 것이 아니고 그 수식내에서만 대상체의 타입을 바꾼 상수를 반환하는 형태다.


이 댓글을 비밀 댓글로
  1. 잘 보고 갑니다!