본문 바로가기
OLD/[C++]개념정리

[개탱][C][C++][2차원배열의 구현 & 사용방식]

by 개탱 2018. 1. 2.
728x90

2차원 배열 만드는 법

 

ㄴ Automatic allocation

 ( 함수에 전달을 할 때 1차원 배열로 계산을 해서 주소를 계산해야함 )

 ( JAVA & C# 에서는 이 방식이 사라져버림 )

 

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main() {
    int iArray[3][4=  {
        {1,2,3,4},
        {11,12,13,14},
        {101,102,103,104}
    }; // Automatic Allocation
 
}
cs

 

위처럼 구현을 해둔뒤

2차원 배열의 내용을 출력 & 각 행의 값을 더하는 함수를 만들어보자 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
 
void printSumForRow(int* p_iData, int row, int col);
 
int main() {
    int iArray[3][4=  {
        {1,2,3,4},
        {11,12,13,14},
        {101,102,103,104}
    }; // Automatic Allocation
 
    for(int i = 0; i < 3; i++) { // 2차원 배열 출력
        for(int j = 0; j < 4; j++) {
            printf("%5d ",iArray[i][j]);
        }
        printf("\n");
    }
 
    for(int i = 0; i < 3; i++) {
        int iSum = 0;
        for(int j = 0; j < 4; j++) {
            iSum += iArray[i][j];
        }
        printf("iSum = %d\n",iSum);
    }
 
    printSumForRow((int*)&iArray[0][0], 34);
    //printSumForRow((int*)&iArray, 3, 4); 위와 같은방법
}
 
void printSumForRow(int* p_iData /*int iData[] 와 같음*/int row, int col){
    for(int i = 0; i < row; i++) {
        int iSum = 0;
        for(int j = 0; j < col; j++) {
            iSum += p_iData[i*col+j];
        }
        printf("iSum = %d\n",iSum);
    }
}
 
cs

이렇게 사용을 하면 비록 2차원배열을 넘겨줘서 사용은 가능하지만

함수내부에서는 1차원 방식으로 사용을 해야하기 때문에 어색하다(?)

 

ㄴ Dynamic allocation 

 ( 만드는게 복잡해지지만 하지만 사용하기는 간편하다)

 ( 하지만 속도가 느리다 (큰 차이는 없지만 Automatic Allocation 에 비해서) )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <malloc.h>
 
int main()
{
    int** x;
    x = (int**)malloc(3*sizeof(int*));
    for(int i = 0; i < 3; i++) {
        x[i] = (int*)malloc(4*sizeof(int));
    }
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 4;j ++) {
            x[i][j] = i+j;
        }
    }
}
 
cs

 

위처럼 구현을 해둔뒤 아까와 같이

2차원 배열의 내용을 출력 & 각 행의 값을 더하는 함수를 만들어보자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <malloc.h>
 
int** malloc2D(int row, int col);
void printSumForRow(int** data, int row, int col);
int main()
{
    int** x;
    x = malloc2D(34);
 
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 4;j ++) {
            x[i][j] = i+j;
        }
    }
    
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 4;j ++) {
            printf("%d ",x[i][j]);
        }
        printf("\n");
    }
    
    printSumForRow(x,3,4);
}
 
int** malloc2D(int row, int col)
{
    int** x;
    x = (int**)malloc(row*sizeof(int*));
    for(int i = 0; i < 3; i++) {
        x[i] = (int*)malloc(col*sizeof(int));
    }
    
    return x;
}
 
void printSumForRow(int** data, int row, int col)
{
        for(int i = 0; i < row; i++)
        {
            int iSum = 0;
            for(int j = 0; j < col; j++)
            {
                iSum += data[i][j];
            }
            printf("iSum = %d\n",iSum);
        }
}
 
cs

 

이렇게 사용을 이제 2차원 배열을 넘겨줘서 Automatic Allocation과 같이 1차원으로 사용하지 않아도 되고 2차원으로 그대로 사용이 가능해진다.

 

아래는 이제 살짝 C++방식으로 프로그래밍 해보겠습니다.

(malloc 을 new로 수정)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
 
int** malloc2D(int row, int col);
void printSumForRow(int** data, int row, int col);
int main()
{
    int** x;
    x = malloc2D(34);
 
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 4;j ++) {
            x[i][j] = i+j;
        }
    }
    
    printSumForRow(x,3,4);
}
 
int** malloc2D(int row, int col)
{
    int** x;
    x = new int*[row];
    for(int i = 0; i < 3; i++) {
        x[i] = new int[col];
    }
    return x;
}
 
void printSumForRow(int** data, int row, int col)
{
        for(int i = 0; i < row; i++)
        {
            int iSum = 0;
            for(int j = 0; j < col; j++)
            {
                iSum += data[i][j];
            }
            printf("iSum = %d\n",iSum);
        }
}
 
void print(int** data, int row, int col)
{
    for(int i = 0; i < row; i++) {
        for(int j = 0; j < col;j ++) {
            printf("%d ",data[i][j]);
        }
        printf("\n");
    }
}
 
cs

 

뭐 비슷합니다

[현 JAVA나 C#에서는 이러한 방식을 가지고 코딩을 합니다]

 

댓글