-
이차원과 삼차원 배열
이차원 배열
- 2차원 배열은 테이블 형태의 구조
- 행(row)과 열(column)의 구조로 표현
이차원 배열선언
- 2개의 대괄호 필요
- 첫 번째 대괄호 : 배열의 행(row) 크기 지정
- 두 번째 대괄호 : 배열의 열(column) 크기 지정
- 배열선언 시 초기값을 저장하지 않을 경우 반드시 행과 열의 크기를 명시하여야 한다.
- 배열 크기는 리터럴 상수, 매크로 상수 또는 그들의 연산식이 허용된다.
- 배열 크기로 변수와 const 상수를 사용 할 수 없다.
- 배열원소의 자료형으로 모든 기본 자료형(정수형, 실수형, 나열형, 무치형)을 사용할 수 있다.
# 배열 선언 시 배열크기는 생략할 수 없으며, # 배열 크기는 리터럴 상수, 매크로 상수 또는 그들의 연산식이 허용된다. 원소자료형 배열이름[행 크기][열 크기];
#define RSIZE 5 #define CSIZE 2 int score[RSIZE][CSIZE]; double point[2][3]; char ch[5][80]; float grade[7][CSIZE];
이차원 배열 구조
- 이차원 배열에서 각 원소를 참조하기 위해서는 2개의 첨자가 필요
- 행 첨자는 0에서 (행 크기 - 1)까지 유효
- 열 첨자는 0에서 (열 크기 - 1)까지 유효
- 배열 선언 int arr [2][3];
- arr [0][0]으로 첫 번째 원소를 참조
- 두번째 원소는 arr [0][1] = arr [0][0] + 1 × 4byte
- 두 번째 행의 첫 항목인 네 번째 원소는 td[1][0]으로 행 첨자가 1 증가
- 행 우선 (row major) 배열
- 행을 먼저 배치하는 특징
- 첫 번째 행의 모든 원소가 메모리에 할당된 이후
- 두 번째 행의 원소가 순차적으로 할당
- 행을 먼저 배치하는 특징
int arr[2][3] → # 총 원소 수(행 크기×열 크기) : 2 × 3 = 6개 arr[0][1] = arr [0][0] + 1 × 4byte arr[0][2] = arr [0][0] + 2 × 4byte arr[1][0] = arr [0][0] + 3 × 4byte = 3 × 4byte + 1 × 4byte arr[1][2] = 3 × 4byte × 2 + 3 × 4byte
int arr[5][7] → # 총 원소 수(행 크기×열 크기) : 5 × 7 = 35개 arr[0][2] = arr[0][0] + 2 × 4byte arr[2][3] = 7 × 4byte × 2 + 4 × 4byte = 7 × 4byte × 2 + (arr[0][0] + 3 × 4byte) arr[3][0] = 7 × 4byte × 3 + 1 × 4byte arr[4][0] = 7 × 4byte × 4 + 1 × 4byte arr[4][6] = 7 × 4byte × 5
2차원 배열 원소 참조
- 외부 반복 제어변수 i
- 행을 0에서 (행의 수 - 1)까지 순차적으로 참조
- 내부 반복 제어변수 j
- 0에서 (열의 수 - 1)까지 열을 순차적으로 참조
- 배열원소의 저장 값이 행과 열의 관계식으로 만들 수 있다면 출력과 같이 중복된 반복문을 사용하여 값을 저장할 수 있다.
for (int i = 0; i < ROWSIZE; i++) { for (int j = 0; j < COLSIZE; j++) printf("%d ", arr[i][j]); puts(""); }
for (int i = 0; i < ROWSIZE; i++) for (int j = 0; j < COLSIZE; j++) arr[i][j]) = i * COLSIZE + j + 1;
이차원 배열 선언 초기화
- 이차원 배열을 선언하면서 초기값을 지정하는 방법은 중괄호를 중첩되게 이용하는 방법과 일차원 배열 같이 하나의 중괄호를 사용하는 방법이 있다.
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; int arr[2][3] = {1, 2, 3, 4, 5, 6}; int arr[][3] = {1, 2, 3, 4, 5, 6};
- 첫 번째 대괄호 내부의 행의 크기는 명시하지 않을 수 있다.
- 두 번째 대괄호 내부의 열의 크기는 반드시 명시
- 행 크기는 명시하지 않고 열 크기만 명시한다면 명시된 배열원소 수와 열 크기를 이용하여 행의 크기를 자동으로 산정
- 두 번째 대괄호 내부의 열의 크기는 반드시 명시
- 2차원 배열에서도 초기값이 총 배열원소 수보다 적게 주어지면 나머지는 모두 기본값이 0, 0.0 또는 '\0'이 저장
3차원 배열
- 대괄호 내부 세 개의 크기는 모두 필요하다.
int arr[2][2][3]; # 총 2 × 2 × 3 = 12개 원소의 3차원 배열 arr[0][0][0] = 1; # 첫 번째 원소 arr[0][0][1] = 1; # 두 번째 원소 arr[0][0][2] = 1; # 세 번째 원소 arr[0][1][0] = 1; # 네 번째 원소 ··· arr[1][1][2] = 1 # 열두 번째(마지막) 원소
배열크기 연산
- 연산자 sizeof를 이용한 식 (sizeof(배열이름) / sizeof(배열원소))
- 저장공간의 크기를 byte 수로 반환하는 연산자 sizeof
- sizeof(배열이름) : 배열의 전체 공간의 byte 수
- sizeof(배열원소) : 배열원소 하나의 byte 수
# 배열크기(배열원소 수) = sizeof(배열이름) / sizeof(배열원소) int arr[] = {1, 2, 3, 4, 5} int arraysize = sizeof(arr) / sizeof(arr[0]); sizeof(arr) = 20 byte sizeof(arr[0]) = 4 byte
2차원 배열크기 계산방법
- 2차원 배열의 행의 수 : (sizeof(배열이름) / sizeof(배열이름[0]))
- 2차원 배열의 열의 수 : (sizeof(배열이름[0]) / sizeof(배열이름[0][0]))
- sizeof(배열이름) : 배열의 전체 공간의 byte 수
- sizeof(배열이름[0]) : 첫 행의 byte 수
- sizeof(배열이름[0][0])) : 첫 번째 원소의 byte 수
# 배열 전체 크기 sizeof(arr) : 48 # 배열의 전체 원소 수 : 12 sizeof(arr) / sizeof(arr[0][0]) # 배열의 행 수 : 4 sizeof(arr) / sizeof(arr[0]) # 배열의 열 수 : 3 sizeof(arr[0]) / sizeof(arr[0][0])
'C' 카테고리의 다른 글
[C] 재귀함수와 라이브러리 함수 (0) 2023.04.13 [C] 함수 (0) 2023.04.13 [C] 배열① (0) 2023.04.05 [C] 반복 (0) 2023.04.03 [C] 연산자② - 관계와 논리, 조건과 비트연산자 (0) 2023.04.01