C, C++

2차원 배열

SuuuuuuuL 2018. 12. 14. 09:48

2차원 배열의 선언과 사용 


***배열명 바로 뒤의 []만 숫자의 생략이 가능 

int a[][3][4] <-- 이렇게...


#include <stdio.h>

int main(){

    int iar[3][4] = {{1,2,3,4}, //0행
                    {11,12,13,14}, //1행
                    {21}}; //2행
                    // {}의 개수는 3행

    // 2차원 배열은 int[4](=하나의 요소)가 3개 있는것과 같음
    // 1차원의 포인터 요소가 3개있다고 생각해놓자...
    // [][] 요소에 해당되는 열(뒤의[])은 숫자를 생략할 수 없음
- 한 요소의 크기를 잡아야 메모리 사이즈를 잡을 수 있기 때문
    // 예) int arr =[][4] = {......}; 로 선언가능
    int arr1[][4]={1,2,3,4,5,6,7};

    int row=sizeof(arr1)/sizeof(arr1[0]); // 전체 크기/ 한요소 크기 = 요소의 개수= 행의 개수
    int column = sizeof(arr1[0])/sizeof(arr1[0][0]); // 한 요소 크기 / 한 칸의 사이즈 = 열의 개수

    // arr1 = arr1[0][0]
    // arr1[0], arr1[1], arr1[2] <--각각의 요소를 대표하는 주소상수

    printf("1:%d, 2:%d\n",row, column);

    for(int i = 0; i < row; i++)    {
        for(int j=0; j<column; j++){
            printf("%d ", arr1[i][j]);
        }
        printf("\n");
    }   
    
}


2차원 배열을 함수에서 매개변수로 받을 때 - int iar[][4]가 포인터 변수로 인식됨  int (*arr)[5] <--이런식으로도 가능

---> arr이 포인터 변수이지만 배열인 여러개의 방 덩어리를 가진다는 것을 표시하기 위해서 뒤에 []이 붙어서 2차원 포인터가 됨


void output(int iar[][4], int row, int col){
// 반드시 열의 개수는 표시하여 보내줘야함(요소의 사이즈가 결정되도록) 행과 열의 개수는
// 전부 보낼 필요는 없으나(단 배열에서 어차피 열은 보내게 되어있음) 행만 보내도 됨
    for(int i = 0; i < row; i++)    {
        for(int j=0; j<col; j++){
            printf("%4d", iar[i][j]);
        }
        printf("\n");
    }   
}



2차원 배열 포인터로 출력하기 

    int ary[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
    
    for(int i = 0; i < 3; i++)
    {
        for(int j =0;j<4;j++){
        printf("%u, %u, %u\n",ary+i, *(ary+i)+j, **(ary+i)+j); // *(*(ary+1)+j)
        //2차원 배열은 *을 두번 찍어야함// 각 행의 첫번째 값만 출력됨
각 행의 첫번째 값 또한 주소니까 *을 또해줘야해~~~
        //3차원이면 ***찍어야됨
        }
    }

출력값 ---> 주소, 주소, 값

<포인터연산>

ary +1 = 열의 크기가 한 덩어리라서(4열 = 4byte*4 --> 16byte 씩 더해짐)

ary+i -> 각 행의 1열값의 주소만을 출력( 각 행의 대표값) 

*(ary+1)을 하면 *을 하나 달아줬으니까 배열의 한 칸(4byte)를 가리키는 값이 됨 --> +1 연산시 4씩 증가 

------------------------------------------------------------------------------------------------------------------------------------------------

1행 

6422256, 6422256, 1

6422256, 6422260, 2

6422256, 6422264, 3

6422256, 6422268, 4

--------------------------

6422272, 6422272, 5

6422272, 6422276, 6

6422272, 6422280, 7

6422272, 6422284, 8

--------------------------------

6422288, 6422288, 9

6422288, 6422292, 10

6422288, 6422296, 11

6422288, 6422300, 12