포인터의 배열과 2차원 배열

포인터로 이루어진 배열을 이용한다면, 배열의 배열도 만들 수 있다. 이를 이용해 이를 2차원 배열처럼 사용할 수 있다.

다음의 용법을 보자.

Untitled

2차원 배열 arr을 만든 후, 포인터변수에 2차원 배열의 각 엔트리의 첫 주소들을 배열로할당한다….(1)

1차원 메모리공간에선 다음처럼 포인터가 주소를 배열 내 값으로 갖는다.

Untitled

예제코드를 보자.

int main()
{
	int arr0[3] = { 1,2,3 };
	int arr1[3] = { 4,5,6 };

	int* parr[2] = { arr0, arr1 }; // an array of pointers
}

1단계, 1차원 배열을 두개 만든후, 그 각각의 변수명을 다시 포인터배열에 값으로 할당한다. 그러면 (1)과 같다.

int main()
{
	int arr0[3] = { 1,2,3 };
	int arr1[3] = { 4,5,6 };

	int* parr[2] = { arr0, arr1 }; // an array of pointers
	
	for (int j = 0; j < 2; ++j)
	{
		for (int i = 0; i < 3; ++i)
		{
			printf("%d(==%d)", parr[j][i], *(parr[j] + i));
		}
		printf("\\n");
	}
	printf("\\n");

}

포인터를 이용해 2차원배열을 출력하는 방법 중 하나.

printf("%d(==%d)", parr[j][i], *(parr[j] + i));

이 부분에서 parr[j][i]로 출력하나, 간접지정을 통해 각 [j]번째 엔트리에서 i만큼 증가하며(이때까지는 주소다) 간접지정 통해(이렇게 해야 값이 나온다.) 출력하나 같다는 점을 알 수 있다.

그리고

*(parr[j] + i)*(*(parr+j)+i) 와 동일하다.

후자는 포인터변수명에 정수 j를 더한 후(주소가 이동한다.) 간접지정하고, 간접지정해서 나온 값인 각 entry의 첫 값(여기선 최초 두개의 배열의 첫 주소가 된다.)에서 다시 각 엔트리 내에서 변위(i)만큼 이동한후 다시 간접지정해서 드디어 실제 배열내의 값(정수)가 나온다.