핵심 정리
배열
배열은 같은 자료형의 변수를 일렬로 늘어놓은 형태입니다. [ ]에 크기를 지정하여 선언하며 선언된 배열에서 [ ]사이에 인덱스를 지정하여 요소에 접근합니다. 특히 배열의 인덱스는 0부터 시작합니다.
자료형 배열이름[크기]; // 배열 선언하기 자료형 배열이름[크기] = { 값, 값, 값 }; // 배열을 선언하면서 값을 초기화하기 배열[인덱스]; // 배열의 요소에 접근 배열[0]; // 배열의 인덱스는 0부터 시작하므로 첫 번째 요소 배열[인덱스] = 값; // 배열의 요소에 값 저장 자료형 *포인터; // 배열을 넣을 수 있는 포인터
2차원 배열
2차원 배열은 가로x세로의 평면 구조로 이루어져 있습니다. 2차원 배열을 선언할 때는 [ ]를 두 번 사용하여 선언하며 첫 번째 대괄호에는 세로 크기, 두 번째 대괄호에는 가로 크기를 지정합니다. 일반적으로 2차원 공간은 가로x세로로 표기하지만 배열로 만들 때는 세로x가로로 표기합니다.
자료형 배열이름[세로크기][가로크기]; // 2차원 배열 선언하기 자료형 배열이름[세로크기][가로크기] = { { 값, 값, 값 }, {값, 값, 값} }; // 2차원 배열을 선언하면서 // 값 초기화하기 배열[세로인덱스][가로인덱스]; // 2차원 배열의 요소에 접근 배열[세로인덱스][가로인덱스] = 값; // 2차원 배열의 요소에 값 저장 자료형 (*포인터이름)[가로크기]; // 2차원 배열을 넣을 수 있는 포인터
3차원 배열
3차원 배열은 높이x세로x가로 형태로 이루어져 있습니다. 3차원 배열은 [ ]에 높이, 세로 크기, 가로 크기를 지정하여 선언합니다. 3차원 공간은 가로x세로x높이로 표기하지만 배열로 만들 때는 높이x세로x가로로 표기합니다.
자료형 배열이름[높이][세로크기][가로크기]; // 3차원 배열 선언하기 자료형 배열이름[높이][세로크기][가로크기] = { // 2차원 배열을 선언하면서 값 초기화하기 { { 값, 값, 값 }, { 값, 값, 값 } }, { { 값, 값, 값 }, { 값, 값, 값 } } }; 배열[높이인덱스][세로인덱스][가로인덱스]; // 3차원 배열의 요소에 접근 배열[높이인덱스][세로인덱스][가로인덱스] = 값; // 3차원 배열의 요소에 값 저장 자료형 (*포인터이름)[세로크기][가로크기]; // 3차원 배열을 넣을 수 있는 포인터
배열의 크기 구하기
배열의 크기를 구할 때는 sizeof 연산자를 사용합니다.
sizeof(배열); // 배열이 차지하는 전체 공간 구하기 sizeof(배열) / sizeof(자료형)); // 배열의 크기 구하기 // 배열이 차지하는 전체 공간을 요소의 크기로 나눠줌 // 또는 sizeof(배열) / sizeof(배열[0]); sizeof(배열) / sizeof(배열[0]); // 2차원 배열의 세로 크기를 구하기 // 배열이 차지하는 전체 공간을 가로 한 줄의 크기로 나눠줌 sizeof(배열[0]) / sizeof(자료형); // 2차원 배열의 가로 크기 구하기 // 가로 한 줄의 크기를 요소의 크기로 나눠줌 // 또는 sizeof(배열[0]) / sizeof(배열[0][0]); sizeof(배열) / sizeof(배열[0]); // 3차원 배열의 높이 구하기 // 배열이 차지하는 전체 공간을 면의 크기로 나눠줌 sizeof(배열[0]) / sizeof(배열[0][0]); // 3차원 배열의 세로 크기 구하기 // 한 면의 크기를 가로 한 줄의 크기로 나눠줌 sizeof(배열[0][0]) / sizeof(자료형); // 3차원 배열의 가로 크기 구하기 // 가로 한 줄의 크기를 요소의 크기로 나눠줌 // 또는 sizeof(배열[0][0]) / sizeof(배열[0][0][0]);
포인터를 배열처럼 사용하기
포인터에 메모리를 할당한 뒤 [ ]에 인덱스를 지정하면 배열처럼 사용할 수 있습니다.
자료형 *포인터이름 = malloc(sizeof(자료형) * 크기); // 포인터를 배열처럼 사용할 수 있음 포인터[인덱스] // 포인터 사용 free(포인터); // 메모리 해제
포인터를 2차원 배열처럼 사용하려면 이중 포인터를 선언한 뒤 세로 공간 메모리를 할당하고, 반복문으로 가로 공간 메모리를 할당하면 됩니다. 해제할 때는 가로 → 세로 순서입니다.
// 포인터를 2차원 배열처럼 사용할 수 있음 자료형 **포인터이름 = malloc(sizeof(자료형 *) * 세로크기); // 배열의 세로 공간 메모리 할당 for (int i = 0; i < 세로크기; i++) // 세로 크기만큼 반복 { 포인터[i] = malloc(sizeof(자료형) * 가로크기); // 배열의 가로 공간 메모리 할당 } 포인터[세로인덱스][가로인덱스]; // 포인터 사용 // 포인터 해제 for (int i = 0; i < 세로 크기; i++) // 세로 크기만큼 반복 { free(포인터[i]); // 가로 공간 메모리 해제 } free(포인터); // 세로 공간 메모리 해제
2차원 배열처럼 사용하는 이중 포인터를 그림으로 나타내면 다음과 같은 모양이 됩니다.
포인터를 3차원 배열처럼 사용하려면 삼중 포인터를 선언한 뒤 먼저 면 공간 메모리를 할당합니다. 반복문으로 세로 공간 메모리를 할당하면서 다시 반복문으로 가로 공간 메모리를 할당하면 됩니다. 해제할 때는 가로 → 세로 → 면 순서입니다.
// 포인터를 3차원 배열처럼 사용할 수 있음 자료형 ***포인터이름 = malloc(sizeof(자료형 **) * 높이); // 배열의 면 공간 메모리 할당 for (int depth = 0; depth < 높이; depth++) { 포인터[depth] = malloc(sizeof(자료형 *) * 세로크기); // 배열의 세로 공간 메모리 할당 for (int row = 0; row < 세로크기; row++) // 세로 크기만큼 반복 { 포인터[depth][row] = malloc(sizeof(자료형) * 가로크기); // 배열의 가로 공간 메모리 할당 } } 포인터[높이인덱스][세로인덱스][가로인덱스]; // 포인터 사용 // 포인터 해제 for (int depth = 0; depth < 높이; depth++) // 높이만큼 반복 { for (int row = 0; row < 세로크기; row++) // 세로 크기만큼 반복 { free(포인터[depth][row]); // 가로 공간 메모리 해제 } free(포인터[depth]); // 세로 공간 메모리 해제 } free(포인터); // 면 공간 메모리 해제
3차원 배열처럼 사용하는 삼중 포인터를 그림으로 표현하면 다음과 같은 모양이 됩니다.