소프트웨어/C++

[2004년 기말 15번] 배열 연산 - 포인터 / 행렬

카켈 2007. 3. 5. 02:10



목적
  - 행렬 연산을 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/전산물리-포인터-이용하기 : 더 쉬운 예제
  - 구글 검색