이런식으로 접근해서 2차원배열을 포인터를 이용해 사용할 수도 있다.
int *temp;
int temp_array[3][2] = {{0,1},{3,5},{7,9}};
temp = temp_array; //temp는 4바이트 대상체를 가르킬수 있는 포인터 변수이다. temp_array는 배열명으로서 대상체의 크기가 24인 2차원배열이다.
오류난다.
temp = &temp_array[0][0]; //&temp_array[0][0]는 2차원배열의 첫번째 주소를 가르키고 대상체가 4바이트이므로 성립한다.
성립한다.
다음은 연산과 연산 후 역참조 할 때의 차이점이다.
int (*temp)[2];
int temp_array[3][2] = {{0,1},{3,5},{7,9}};
temp = temp_array;
cout<<temp+0<<endl;
cout<<*(temp+0)<<endl;
cout<<sizeof(temp+0)<<endl;
cout<<sizeof(*(temp+0))<<endl;
cout<<temp+1<<endl;
cout<<*(temp+1)<<endl;
cout<<sizeof(temp+1)<<endl;
cout<<sizeof(*(temp+1))<<endl;
포인터에서 +1 연산을 하였으므로 8크기만큼 이동한다. (2차원배열포인터이기때문에) 만약 그냥 1차원 포인터였다면 4만큼 이동하였을꺼다. 그리고 *연산을 하게되면 값을 취하게 됐을것이다.
하지만 여기선 *를 하게 됨으로 대상체가 행 전체로 바뀌게되면서 사이즈가 8로 바뀌는것을 볼 수 있다.
(temp+1)은 그냥 주소+정수 해서 연산을해서 주소위치만 바뀌었을뿐 이다. *(temp+1)을 함으로써 대상체가 바뀌게 된다. 즉, temp+1행을 가르키게 된다.
(가르키고 있는 주소는 보는바와 같이 같다. 단, 대상체가 다를뿐)
포인터 접근순서
int (*temp)[2];
int temp_array[3][2] = {{0,1},{3,5},{7,9}};
temp = temp_array;
cout<<*(*(temp+2)+1)<<endl;
+2를 함으로 3번째 행에 접근하였고 *연산을 하여서 해당 행을 가르키고있다. +1연산을 하여 해당 행에 2번째 열의 주소에 접근하였고 *연산을 하여 값에 접근하였다. 그래서 9가 출력된다.