2010. 5. 20. 21:50
2차원 배열 포인터란 2차원 배열을 담는 포인터이다.
int temp_array[3][2] = {{0,1},{3,5},{7,9}}; //2차원 배열
int (*temp)[2]; //2차원 배열포인터
temp = temp_array;
2차원 배열은 이렇게 2차원 배열포인터를 이용해서 가르킬수 있다.
아래서는 대상체에 대해서 개념을 이해해보자.
대상체란 말 그대로 가르키는 대상이 무엇이냐인데 아래를 보자.
int (*temp)[2];
int temp_array[3][2] = {{0,1},{3,5},{7,9}};
1. temp = temp_array;
2. temp = temp_array[0];
3. temp = &temp_array[0][0];
위와 같이 실행하게되면 되야 된다고 생각할 수 있지만 1번만 성립된다.
왜냐하면...여기서 대상체에 대한 이해가 필요하다.
우선 1,2,3번은 주소값은 모두 같다.
1번은 temp는 2개의 대상체를 가진 값을 가르킬수 있는 포인터이고 temp_array는 2차원 배열의 배열명이기 때문에 당연히 성립한다.
문제는 2번과 3번인데
2번은 temp_array[0]같은 경우 행을 대표하는 것으로서 대상 체가 1번과 같이 배열 전체가 아니라 해당 행 전체인 것이다. 그러므로 temp가 가르킬 수 없는 것이다.
3번 같은 경우도 비슷하다. &temp_array[0][0]는 대상체가 temp_array[0][0]여서 불가능하다.
int temp_array[3][2] = {{0,1},{3,5},{7,9}};
1. temp = temp_array;
2. temp = temp_array[0];
3. temp = &temp_array[0][0];
위와 같이 실행하게되면 되야 된다고 생각할 수 있지만 1번만 성립된다.
왜냐하면...여기서 대상체에 대한 이해가 필요하다.
우선 1,2,3번은 주소값은 모두 같다.
1번은 temp는 2개의 대상체를 가진 값을 가르킬수 있는 포인터이고 temp_array는 2차원 배열의 배열명이기 때문에 당연히 성립한다.
문제는 2번과 3번인데
2번은 temp_array[0]같은 경우 행을 대표하는 것으로서 대상 체가 1번과 같이 배열 전체가 아니라 해당 행 전체인 것이다. 그러므로 temp가 가르킬 수 없는 것이다.
3번 같은 경우도 비슷하다. &temp_array[0][0]는 대상체가 temp_array[0][0]여서 불가능하다.
이번엔 더 분명하게 대상체에 대해서 sizeof를 통해서 알아보자.
int (*temp)[2]; //*temp는 2개의 대상체를 가지고있는 배열을 가르킨다 라고 생각하자.
int temp_array[3][2] = {{0,1},{3,5},{7,9}};
temp = temp_array;
cout<<temp_array<<endl;
cout<<temp_array[0]<<endl;
cout<<&temp_array[0][0]<<endl;
cout<<sizeof(temp_array)<<endl;
cout<<sizeof(temp_array[0])<<endl;
cout<<sizeof(&temp_array[0][0])<<endl;