Post

C언어 :: 포인터와 배열에 대한 이해

C언어 :: 포인터와 배열에 대한 이해

C언어의 포인터와 배열에 대한 이해도를 높일 수 있는 글입니다.

2차원 배열

2차원 배열의 선언방식은 int arr[3][4]; 와 같이 1차원 배열의 선언 방식과 매우 유사하다.

1
2
3
4
5
6
7
8
9
int main() {
    int arr1[3][4];
    int arr2[7][9];

    printf("세로3, 가로4: %d \n", sizeof(arr1));
    printf("세로7, 가로9: %d \n", sizeof(arr2));

    return 0;
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int main() {
  int villa[4][2];
  int popu, i, j;

  // 가구별 거주인원 입력 받기
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 2; j++) {
      printf("%d층 %d호 인구 수: ", i + 1, j + 1);
      scanf("%d", &villa[i][j]);
    }
  }

  for (i = 0; i < 4; i++) {
    popu = 0;
    popu += villa[i][0];
    popu += villa[i][1];
    printf("%d층 인구 수: %d \n", i + 1, popu);
  }

  return 0;
}


2차원 배열의 메모리상 할당의 형태

컴퓨터의 메모리는 1차원적 구조이기 때문에 다차원 배열이라고 하더라도 메모리상에는 1차원적 구조로 저장될 수 밖에 없다. 다음 프로그램의 출력 결과를 통해 이를 증명할 수 있으며, 배열 요소별 주소 값이 int형 변수의 크기인 4byte 만큼 차이가 남을 알 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>

int main() {
  int arr[3][2];
  int i, j;

  for (i = 0; i < 3; i++) {
    for (j = 0; j < 2; j++) {
      printf("%p \n", &arr[i][j]);
    }
  }

  return 0;
}

/*
출력결과
0x16fdff0e0 
0x16fdff0e4 
0x16fdff0e8 
0x16fdff0ec 
0x16fdff0f0 
0x16fdff0f4
*/


2차원 배열 역시 배열의 길이를 명시하지 않고도 초기화가 가능하지만 제약사항이 존재한다. 다음과 같은 선언이 있다면 컴파일러가 배열의 가로와 세로의 길이를 결정할 수 있는 정보가 부족할 것이다.

int arr[][] = {1, 2, 3, 4, 5, 6, 7, 8};

때문에 2차원 배열을 선언과 동시에 초기화하는 경우에는 다음과 같이 배열의 세로길이만 생략 가능하다.

int arr[][2] = {1, 2, 3, 4, 5, 6, 7, 8};

This post is licensed under CC BY 4.0 by the author.