이런식으로 접근해서 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
배열포인터의 특징  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
배열과 포인터  (0) 2010.05.19
포인터란?  (0) 2010.05.19
Posted by 아몰라

댓글을 달아 주세요