배열표기
array[1][1] = 23;
포인터표기
*(*(array+1)+1) = 23;
array 배열은 표기는 2차원이지만 1차원 배열인 array[6]과 동일한 형태이다.
array[0]와 array[1]이 연결되어있기때문에 array[1]의 주소를 저장하기위한 추가 메모리가 필요하지 않다.
추가적으로 array[1] 의 항목들을 array[0]를 사용하여 접근 가능하다.
array[1][0] 는 array[0][3]~~ 이런식. 주소가 연속적이기때문.
반면 포인터는 다음 포인터로 이동하기위해, 메모리의 주소가 저장되어야한다.
메모리 블록들이 연속하지 않기때문에 포인터로 연결해야하는 구조이다.
포인터 p는 노란색 메모리의 시작 주소를, 노란색 메모리는 각 빨간색 메모리의 시작 주소를 가르킨다.
그렇기때문에 2차원 배열에서는 없던 3칸의 메모리가 추가로 필요하다.
따라서 아래의 코드는 오류가 발생한다.
char array[2][3];
char **p;
p = array; //error 자료형 불일치
추가적으로, 2차원 배열을 2차원 포인터로 접근하는 방법이다.
char array[2][3];
char *p;
p = (char *)array;
char array[2][3];
char (*p)[3];
p = array;