본문 바로가기

개발공부/C++

다중포인터와 동적 다차원 배열

int main()
{
    const int row = 3;
    const int col = 5;
    
    const int s2da[row][col] =
    {
    {1, 2, 3, 4, 5},
    {6, 7, 8, 9, 10},
    {11, 12, 13, 14, 15}
    };
    
    int *r1 = new int[col] {1, 2, 3, 4, 5};
    int *r2 = new int[col] {6, 7, 8, 9, 10};
    int *r3 = new int[col] {11, 12, 13, 14, 15};
    
    int **rows = new int*[row] {r1, r2, r3};
    
    for(int r = 0; r < row; ++r)
    {
    	for(int c = 0; c < col; ++c)
        {
        	cout << rows[r][c] << " ";
        }
        cout << endl;
     }
    delete[] r1;
    delete[] r2;
    delete[] r3;
    delete[] rows;
    
    return 0;
}

for문을 돌려서 할 수도 있다.

int main()
{
    const int row = 3;
    const int col = 5;
    
    const int s2da[row][col] =
    {
    {1, 2, 3, 4, 5},
    {6, 7, 8, 9, 10},
    {11, 12, 13, 14, 15}
    };
    
    int **matrix = new int*[row];
    
    for(int r = 0; r < row; ++r)
    {
    	matrix[r] = new int[col];
    }
    //r=0일때
    //matrix[0]에 5칸 짜리 배열의 첫 번째주소가 대입
    //r=1일때
    //matrix[1]에 5칸 짜리 배열의 첫 번째주소가 대입
    //....
    
    for(int r = 0; r < row; ++r)
    {
    	for(int c = 0; c < col; ++c)
        {
        	matrix[r][c] = s2da[r][c];
        }
    }
    //matrix[0]이면 5칸짜리 배열의 첫 번째 주소이므로
    //(matrix[0])[0]이면 위와 같은 주소이다.
    
    //print all elemants
    for(int r = 0; r < row; ++r)
    {
    	for(int c = 0; c < col; ++c)
        {
        	cout << matrix[r][c] << " ";
        }
        cout << endl;
    }
    
    //delete
    for(int r = 0; r < row; ++r)
    {
    	delete[] matrix[r];
    }
    delete[] matrix;
    return 0;
}

포인터의 포인터를 쓰기가 부담스럽다면

int main()
{
    const int row = 3;
    const int col = 5;
    
    const int s2da[row][col] =
    {
    {1, 2, 3, 4, 5},
    {6, 7, 8, 9, 10},
    {11, 12, 13, 14, 15}
    };
    
    int *matrix = new  int [row*col];
    
    for(int r = 0; r < row; ++r)
    {
    	for(int c = 0; c < col; ++c)
        {
        	matrix[c + col * r] = s2da[r][c];
        }
    }
    
    //print all elemants
    for(int r = 0; r < row; ++r)
    {
    	for(int c = 0; c < col; ++c)
        {
        	cout << matrix[c + col * r] << " ";
        }
        cout << endl;
    }    
    
    delete[] matrix;

    return 0;
}

대부분의 선형대수학 코드들이 위와같이 인덱싱을 해서 쓰인다.

후에 하드웨어가속을 받기위해 더 복잡한 인덱싱이 필요할 수 있다.

'개발공부 > C++' 카테고리의 다른 글

정적 멤버  (0) 2019.10.23
다양한 반환 값들  (0) 2019.10.22
포인터와 참조의 멤버 선택  (0) 2019.10.22
참조변수 reference variable  (0) 2019.10.22
자료형에게 가명 붙여주기  (0) 2019.10.21