더블포인터, 포인터의 포인터는 예상하건데 다른 포인터의 주소를 가지는 포인터일 것이다.
int value=5;
int* ptr = &value;
std::cout<<*ptr;
int** ptrptr = &ptr; //pointer의 주소
std::cout<<**ptrptr;
//5
//5
이중포인터는 포인터의 주소를 저장하며
일반 포인터처럼 동작한다.
int value = 5;
int** ptrptr= &&value; //not valid
이딴 짓은 할 수 없다.
&연산자는 l-value가 필요한데 &뒤의 &value는 r-value이기 때문이다.
int** ptrptr = nullptr; //경우에 따라 0일 수 있음.
이중포인터를 null로 설정할 수 있다.
필요한 메모리 공간이 예측되지 않는 경우에 프로그램 작성 시 할당받지 않고
실행 중에 운영체제로부터 할당받게 하는 방법
운영체제가 관리하는 heap(물론 RAM위에 있음)으로부터 할당
new 연산자로 할당 후 delete 연산자로 메모리 힙에 반환
데이터타입 *포인터변수 = new 데이터타입;
delete 포인터변수; //포인터 안에 저장된 heap의 주소값을 지운다는 의미. 포인터변수 자체는 여전히 존재.
포인터는 동적할당시에 쓰인다.
이중 포인터는 2차원 동적할당에 이용한다.
int array[10][5];
고정 배열은 아주 행복하다.
int** array = new int[10][5];
슬프게도 이딴건 안통한다.
만약 마지막 차원이 constant라면 이런 방식이 가능하다.
int(*array)[5]=new int[10][5];
슬프게도 마지막 차원이 constant가 아니라면 복잡하다.
int** array = new int*[10]; //rows
for (int count =0; count<10; ++count)
array[count] = new int[5]; //columns
이렇게 한 다음 배열 접근은 일반적으로 할 수 있다.
array[9][4] = 3;
2차원 동적 할당은 해제도 loop가 필요하다.
할당한 순서의 반대로 해제한다.
for(int count=0; count<10; ++count)
delete array[count];
delete array;