본문 바로가기

c언어

이중 포인터

이중 포인터다. 포인터 포스팅이 시작된 뒤로 꽤 많은 이야기를 했지만. 아직도 남아있다.

어쩔 수 없이 포인터란 C언어와 뗄 수 없는 존재이므로 굳이 제목에 없더라도 포인터를 이용한 접근 및 활용에 대한 이야기들이 나올 수밖에 없다.

 

이전 포인터 포스팅에 포인터는 "변수의 주소값을 저장하는 변수" 라는 정확한 워딩은 기억나지 않지만, 비슷한 맥락의 얘기를 한 적이 있다.

 

변수의 주소값을 저장하는 변수, 즉 포인터 또한 변수이다. 그 말은 또한 포인터도 어딘가에 저장되어있단 뜻이고 그 또한 주소값을 가지고 있다는 말이 된다.

이해 안되는게 맞는 말이다. 말이 어렵다. 그러니 나는 여느때와같이 예시를 들어주겠다.

int iTemp= 10;



int* pTemp= &iTemp;

 

이 두 줄이 이해가 되지 않는다면 당신은 포인터에 대해 모르는것이니 포인터 포스팅으로 돌아가 다시 이해하고 오자.

int iTemp와 int포인터 pTemp가 있고 pTemp에는 iTemp의 주소값이 저장되어있다.

하지만 pTemp도 어딘가에 저장되는 변수이고 그말은 pTemp도 주소값이 있다는 말이다. 비교를 위해 두가지를 출력해보겠다.

cout << pTemp <<endl;

cout << &pTemp << endl;

 

iTemp의 주소값인 pTemp를 출력하고 그 밑의 줄에는 pTemp의 주소값인 &pTemp를 출력하였다. 둘은 엄연히 다를것이다.

이해가 되는가? 그럼 iTemp와 pTemp는 엄연히 다른 공간에 저장되어있는 별개의 변수이다.

 

그렇다면 pTemp의 주소값이 바로 이중 포인터다.

 

포인터의 값을 저장한 변수의 포인터 라는거다. 그럼 이것은 어디에 저장되는가?? 이또한 포인터이니 일반 포인터에 저장이 될까??

즉,

int* Test= &pTemp;

가 될까?? 라는질문이다.

정답은 안된다.

 

 

int* 의 저장값은 포인터이고 그 내용물은 int의 포인터이다.

하지만 &pTemp는 저장값은 포인터이고 그 내용물은 int형 포인터의 포인터이다. 엄연히 읽는 방식이 달라지므로 이렇게 되면 문제가 생긴다. 그러므로 이것은 컴파일러가 찾아올만한 일이다. 그렇다면 이중포인터는 어디에 담을 수 있는가??

간단하다 별 하나만 더 붙이도록 하자.

int** ppTemp = &pTemp;

 하면 포인터의 포인터를 넣을 수 있는 공간에 포인터의 포인터를 넣은것이니 아무런 문제가 없다.

 

그럼 이걸 언제쓰느냐?? 모른다. 내가 모르는것이 아니고 그냥 이건 설명하기 어렵다. 언제 이것을 쓰게될지 상황이 너무 많기 때문에 모른다고 하는것이다. 이전 함수를 이용해 원본의 값을 조작하기 위해 포인터를 사용했는데, 이때 포인터를 이용했듯, 포인터의 값을 조작하기 위해 이중포인터를 사용하게 된다.

이는 논리가 꽤나 복잡하고 쉽지 않으니 한번 쓰기 위해서는 머리를 좀 많이 써야한다. 다만 그렇다고 이것을 안쓰겠다는것은 안된다. 원본의 값을 조작할때 포인터를 쓰는것처럼 프로그램을 짜다보면 쓸 수밖에 없는 상황들이 많다.

 

그렇다고 당장 쓰라는 말은 또 아니다. 아직 포인터가 익숙하지 않은 사람이라면 포인터먼저 친해지자. 애인과 친해지기 전에 애인의 부모님과 친해질 수는 없지 않겠는가??

애인이 없으시다면..... 글쎄 난 딱히 미안하지 않다. 나도 없으니 우리 같이 울도록하자.

 

이중포인터에 대해서는 여기서 줄이고 다음에 내가 사용할 시점에 더 설명해보도록 하자.

 

이상 이중 포인터를 마친다. 평소보다 글이 짧은데 어쩔 수 없다. 이중포인터가 설명을 많이 요하는 부분도 아니고 다음 내용은 또 문자열이라 이중포인터랑 같이 말하기엔 공통점이 크게 있진 않은거라  여기서 한턴 끊고 가겠다.

'c언어' 카테고리의 다른 글

사용자 정의형 자료형 - 구조체  (0) 2023.02.06
문자열  (0) 2023.02.06
이중배열과 포인터배열  (1) 2023.02.05
포인터와 배열  (1) 2023.02.03
포인터2 그리고 포인터 연산  (0) 2023.02.03