[2004년 기말 15번] 배열 연산 - 포인터 / 행렬
목적
- 행렬 연산을 C 와 연관시키고 포인터를 활용하여 배열을 쉽게 접근한다.
문제
코드
#include <iostream>
using namespace std;
int main(void)
{
int aiMatrixA[2][3] = {0};
int aiMatrixB[2][3] = {0};
int aiIn[6] = {0};
int *pMatrixA, *pMatrixB, i;
pMatrixA = pMatrixB = 0;
i = 0;
pMatrixA = &aiMatrixA[0][0];
pMatrixB = &aiMatrixB[0][0];
cout << "첫번째 행렬의 각 원소의 6개를 입력하세요 : ";
while(i<6)
{
cin >> aiIn[i];
*pMatrixA = aiIn[i];
i++;
pMatrixA++;
}
i = 0;
cout << "두번째 행렬의 각 원소의 6개를 입력하세요 : ";
while(i<6)
{
cin >> aiIn[i];
*pMatrixB = aiIn[i];
i++;
pMatrixB++;
}
i = 0;
pMatrixA = &aiMatrixA[0][0];
pMatrixB = &aiMatrixB[0][0];
cout << "x = " << endl << '\t';
while(i < 3)
{
cout << *pMatrixA << " ";
pMatrixA++;
i++;
}
cout << endl << '\t';
while(i < 6)
{
cout << *pMatrixA << " ";
pMatrixA++;
i++;
}
i = 0;
cout << endl << "y = " << endl << '\t';
while(i < 3)
{
cout << *pMatrixB << " ";
pMatrixB++;
i++;
}
cout << endl << '\t';
while(i < 6)
{
cout << *pMatrixB << " ";
pMatrixB++;
i++;
}
i = 0;
pMatrixA = &aiMatrixA[0][0];
pMatrixB = &aiMatrixB[0][0];
cout << endl << "x + y = " << endl << '\t';
while(i < 3)
{
cout << *pMatrixA + *pMatrixB << " ";
pMatrixA++;
pMatrixB++;
i++;
}
cout << endl << '\t';
while(i < 6)
{
cout << *pMatrixA + *pMatrixB << " ";
pMatrixA++;
pMatrixB++;
i++;
}
cout << endl;
return 0;
}
해설
- 포인터는 주소를 가리키므로 해당 행렬의 첫번째 번지를 가리키게 합니다. 포인터 값을 +1 한다는 것은 해당 주소형인 int 형의 자료크기 만큼 이동하므로 행렬에서 옆 원소로 이동하며 by 줄(행)이 끝이 나면 다음 줄(열)로 이동합니다.
- 포인터에 * 가 붙은것은 참조 하라는 뜻으로 해당 주소에 저장된 값을 불러 냅니다. 6칸읜 셀(원소가 각각 aiMatrixA 와 aiMatrixB 로 저장되어 있습니다. 포인터로 한 원소씩 접근할수 있게 했습니다.
- 행렬이 저장된 구조와 포인터가 접근하는 방식에 대해 이해하면 코드 풀이가 한결 쉬워집니다.
참고
- http://reduck.uos.ac.kr/entry/전산물리-포인터-이용하기 : 더 쉬운 예제
- 구글 검색