Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Tags
more
Archives
Today
Total
관리 메뉴

문타쿠, 공부하다.

[C언어 코딩 도장] Unit 37. 2차원 배열 사용하기 본문

C언어/C언어 코딩 도장

[C언어 코딩 도장] Unit 37. 2차원 배열 사용하기

개발새발 문타쿠 2023. 9. 19. 11:20

37.1 2차원 배열을 선언하고 요소에 접근하기

#include <stdio.h>

int main(void)
{
    int numArr[3][4] = {
        { 0,  1,  2,  3},
        {10, 11, 12, 13},
        {20, 21, 22, 23}
    };
    
    printf("%d\n", numArr[0][1]);
    printf("%d\n", numArr[1][2]);
    printf("%d\n", numArr[2][3]);

    return 0;
}


37.2 2차원 배열을 초기화하기

#include <stdio.h>

int main(void)
{
    int numArr[3][4] = { 0, };
    
    printf("%d\n", numArr[0][1]);
    printf("%d\n", numArr[1][2]);
    printf("%d\n", numArr[2][3]);

    return 0;
}


37.3 2차원 배열의 요소에 값 할당하기

#include <stdio.h>

int main(void)
{
    int numArr[3][4];
    
    numArr[0][0] = 0;
    numArr[1][2] = 12;
    numArr[2][3] = 23;

    printf("%d\n", numArr[0][0]);
    printf("%d\n", numArr[1][2]);
    printf("%d\n\n", numArr[2][3]);
    
    printf("%d\n", numArr[0][3]);

    return 0;
}

  • 값을 초기화 하지 않고 특정 공간에만 특정 값을 할당했기 때문에, 값을 할당하지 않은 나머지 공간에는 쓰레기 값이 담겨있다. -> 출력해보면 이상한 숫자가 나옴
#include <stdio.h>

int main(void)
{
    int numArr[3][4] = { 0, };

    numArr[0][0] = 0;
    numArr[1][2] = 12;
    numArr[2][3] = 23;

    printf("%d\n", numArr[0][0]);
    printf("%d\n", numArr[1][2]);
    printf("%d\n\n", numArr[2][3]);

    printf("%d\n", numArr[0][3]);

    return 0;
}

  • 만약 배열을 0으로 초기화한 후 특정 공간에 특정 값을 할당한 거라면, 특정 값을 할당하지 않은 공간에는 쓰레기 값 대신 0이 담겨져있어 출력하면 0값이 나올 것이다.

37.4 2차원 배열의 크기 구하기

#include <stdio.h>

int main(void)
{
    int numArr[3][4] = {
         { 0,  1,  2,  3},
         {10, 11, 12, 13},
         {20, 21, 22, 23}
    };

    // 4바이트 공간이 3 * 4 = 12개 => 48
    printf("%zd\n", sizeof(numArr));

    // 0번 행은 4바이트 공간이 4개 => 16
    printf("%zd\n", sizeof(numArr[0]));

    // 행
    int row = sizeof(numArr) / sizeof(numArr[0]);
    printf("%d행 ", row);

    // 열
    int col = sizeof(numArr[0]) / sizeof(int);
    printf("%d열", col);

    return 0;
}

37.5 반복문으로 2차원 배열의 요소를 모두 출력하기

#include <stdio.h>

int main(void)
{
    int numArr[3][4] = {
         { 0,  1,  2,  3},
         {10, 11, 12, 13},
         {20, 21, 22, 23}
    };

    // 행
    int row = sizeof(numArr) / sizeof(numArr[0]);
    printf("%d행 ", row);

    // 열
    int col = sizeof(numArr[0]) / sizeof(int);
    printf("%d열\n", col);

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

    return 0;
}

"역순으로 출력하기"

#include <stdio.h>

int main(void)
{
    int numArr[3][4] = {
         { 0,  1,  2,  3},
         {10, 11, 12, 13},
         {20, 21, 22, 23}
    };

    // 행
    int row = sizeof(numArr) / sizeof(numArr[0]);
    printf("%d행 ", row);

    // 열
    int col = sizeof(numArr[0]) / sizeof(int);
    printf("%d열\n", col);

    for (int i = row - 1; i >= 0; i--)
    {
        for (int j = col - 1; j >= 0; j--)
        {
            printf("%d ", numArr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

37.6 2차원 배열을 포인터에 넣기

1차원 배열은 단일 포인터에 넣을 수 있다. 그렇다면, 2차원 배열은 이중 포인터에 넣을 수 있을까?

위와 같이 2차원 배열을 이중 포인터에 넣으면 경고 발생

 

2차원 배열을 포인터에 담으려면 다음과 같은 특별한 방법이 필요하다.

// 열의 크기가 4인 배열을 가리키는 포인터
int (*numPtr)[4];

-> 포인터를 선언할 때 *와 포인터 이름은 괄호로 묶어준 뒤 [ ]에 열의 크기를 지정

 

*주의

// int형 포인터를 4개 담는 포인터 배열
int *numPtr[4];

// 배열을 가리키는 배열 포인터
int (*numPtr)[4];

 

int (*numPtr)[4];

#include <stdio.h>

int main(void)
{
    int numArr[3][4] = {
         { 0,  1,  2,  3},
         {10, 11, 12, 13},
         {20, 21, 22, 23}
    };

    int(*numPtr)[4] = numArr;

    printf("numArr  : %p\n", numArr);
    printf("numPtr  : %p\n\n", numPtr);

    printf("*numArr : %p\n", *numArr);
    printf("*numPtr : %p\n\n", *numPtr);

    printf("**numArr: %d\n", **numArr);
    printf("**numPtr: %d\n\n\n", **numPtr);

    printf("numArr[0] : %p\n", numArr[0]);
    printf("*numArr[0]: %d\n\n", *numArr[0]);

    printf("numArr[1] : %p\n", numArr[1]);
    printf("*numArr[1]: %d\n\n", *numArr[1]);

    printf("numArr[2] : %p\n", numArr[2]);
    printf("*numArr[2]: %d\n\n\n", *numArr[2]);

    // 배열과 포인터의 크기가 다름
    printf("sizeof(numArr): %zd\n", sizeof(numArr));
    printf("sizeof(numPtr): %zd\n", sizeof(numPtr));

    return 0;
}

int (*numPtr)[4];

 

*참조

https://www.youtube.com/watch?v=wg4j5dtAP1E