이런식으로 접근해서 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가 출력된다.

'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
2차원 포인터 배열  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
배열과 포인터  (0) 2010.05.19
포인터란?  (0) 2010.05.19
Posted by 아몰라