[C언어] 이중포인터, 더블포인터 설명
본문 바로가기
C++/C Basic

[C언어] 이중포인터, 더블포인터 설명

by Macgyvering2 2020. 10. 5.

포인터는 주소를 저장하는 '변수'이다.

주소를 저장한다는 특수한 목적이 있는 것일 뿐, 포인터는 당연히 변수이다.

그래서 포인터의 주소값을 가리키는 포인터인 더블 포인터가 존재할 수 있는 것이다.

 

선언하는 방법은 포인터를 선언할 때처럼 더블 포인터를 선언하고,

포인터가 변수의 주소를 담는 것처럼, 더블 포인터는 포인터의 주소를 담으면 된다. 

더블 포인터의 값은 포인터인 변수의 주소값이 나오고,

더블 포인터의 값의 값은 포인터의 값인 변수의 값이 나온다.

더블 포인터의 값이 포인터이기 때문이다.

 

이해를 위해 아래의 예제를 보자.

#include <stdio.h>

/* 이중 포인터 예제1 */
void function(int** dptr)
{
	printf("호출완료, 넘겨받은 더블 포인터가 가르키는 값: %d\n", **dptr);
}

int main(void)
{
	int num = 1;
	int* ptr = &num;
	int** double_ptr = &ptr;
	function(double_ptr);

	return 0;
}

main 함수에는 num 변수가 있다.

이 변수의 주소(&num)를 포인터 변수를 선언하여 바로 대입해주었다.

포인터 변수의 주소(&ptr)를 더블 포인터 변수를 선언하여 바로 대입해주었다.

 

그래서 더블 포인터를 * 연산자를 통해 한꺼풀 벗겨내면 더블 포인터가 가리키고 있는 포인터가 되고,

그 포인터를 * 연산자를 통해 한꺼풀 더 벗겨내면 그 포인터가 가리키고 있는 변수의 값이 되는 것이다. 

 

더블 포인터를 도대체 왜 쓸까?

값을 직접 전부 넘겨주는 것보다, 그 값을 가리키고 있는 주소값을 넘겨주면 시간적으로, 리소스적으로 장점이 많기 때문이다. 1차원 배열에는 포인터를 쓰면 되지만, 영상 같은 2차원 배열에는 더블 포인터가 들어가야 할 것이다. 만약 영상 데이터를 값에 의한 호출(Call by value)로 넘겨준다면 시간도 오래 걸려서 속도도 느릴뿐더러, 하드웨어 리소스 낭비가 엄청 심할 것이기 때문이다.

댓글