티스토리 뷰
2021.03.02.화
3차원 배열
✔ 2차원 배열은 1차원 배열을 요소로 가졌다면, 3차원 배열은 2차원 배열을 요소로 가진다.
✔ 3차원 배열은 3개의 첨자를 사용하여 선언한다.
int score[2][3][4];
✔ 2차원 배열에서 각 행은 1차원 배열로서 2차원 배열을 구성하는 하나의 부분 배열이 된다.
✔ 3차원 배열에서 각 행은 2차원 배열로서 3차원 배열을 구성하는 하나의 부분 배열이 된다.
✔ 2차원 배열이 행과 열로 이루어져 있다면, 3차원 배열은 면과 행, 열으로 이루어져 있다.
int classAscore[3][5]={
{90, 80, 70, 60, 50},
{50, 70, 60, 40, 80},
{70, 40, 20, 90, 70}
};
int classBscore[3][5]={
{40, 30, 10, 20, 50},
{60, 90, 60, 80, 80},
{90, 20, 10, 80, 40}
};
✔ 만약 위와 같이 A반과 B반 학생들의 점수를 의미하는 2차원 배열이 2개가 있는 경우,
✔ int[2][5][3] 와 같이 3차원 배열을 선언해서 사용할 수 있다.
int score[2][3][5]={
{
{90, 80, 70, 60, 50},
{50, 70, 60, 40, 80},
{70, 40, 20, 90, 70}
},
{
{40, 30, 10, 20, 50},
{60, 90, 60, 80, 80},
{90, 20, 10, 80, 40}
}
};
✔ 3차원 배열을 처리할 때에는 구조에 맞게 3중 for문을 사용하여 순서대로 면,행,열을 다루어야 한다.
for(int i=0; i<2; i++){ //i = 면을 다루기위한 변수
for(int j=0; j<3; j++){ //j = 행을 다루기위한 변수
for(int k=0; k<5; k++){ //k = 열을 다루기위한 변수
printf("%d, ",score[i][j][k]);
}printf("\n");
}printf("\n");
}
포인터 배열 선언과 사용
✔ 포인터 주소를 저장하는 배열이며 일반 변수처럼 메모리에 저장 공간을 갖는다.
✔ 따라서 같은 유형의 포인터가 여럿 필요한 경우 포인터형의 배열을 사용하자.
✔ 포인터 배열은 같은 자료형의 포인터를 모아 만들어둔 배열.
int *parr[3];
✔ 포인터 변수 배열은 일반 배열을 선언하는 방식과 동일
✔ 포인터 변수와 마찬가지로 포인터 변수의 배열임을 표시하기 위해 선언할 때 * 을 붙여준다.
char *pary[5] = { "dog", "elephant", "horse", "tiger", "lion" };
char animal[5][20] = { "dog", "elephant", "horse", "tiger", "lion" };
✔ 위와 같이 문자열 상수를 사용해 포인터 변수 배열을 초기화하면,
✔ 문자열 상수는 곧 주소를 의미하므로 문자열 상수의 주소를 저장한다.
✔ 2차원 char 배열의 초기화는 문자열 상수 자체를 배열의 공간에 저장한다.
✔ char 포인터 배열의 초기화 형태는 2차원 char 배열의 초기화의 형태와 같다.
✔ 초기화 방법이 동일하므로, 컴파일러는 선언된 배열의 형태에 따라 적절한 초기화를 수행한다.
#include <stdio.h>
int main(void)
{
char *pary[5];
int i;
pary[0]="dog";
pary[1]="elephant";
pary[2]="horse";
pary[3]="tiger";
pary[4]="lion";
for (i = 0; i < 5; i++){
printf("%s\n", pary[i]);
}
return 0;
}
✔ 선언과 동시에 초기화하지 않고 각 요소마다 초기화를 할 수 도 있다.
2차원 배열처럼 활용하는 포인터 배열
✔ 포인터 배열은 첨자를 하나 사용하는 1차원 배열이지만, 2차원 배열로 활용할 수 있다.
✔ 아래와 같이 1차원 배열을 포인터 배열로 연결하면 2차원 배열처럼 사용할 수 있다.
int arr1[4] = { 1, 2, 3, 4 };
int arr2[4] = { 4, 5, 6, 7 };
int arr3[4] = { 7, 8, 9, 10 };
int *arr[3] = { arr1, arr2, arr3 };
✔ 각각 arr1, arr2, arr3 은 첫 번째 요소의 주소 값이므로, 배열명을 사용해서 포인터에 저장할 수 있다.
✔ 그리고 arr는 2차원 배열의 배열명처럼 사용되고,
✔ 각 배열의 요소 arr[0], arr[1], arr[2]는 부분 배열명의 기능을 한다.
int arr1[4] = { 1, 2, 3, 4 };
int arr2[4] = { 4, 5, 6, 7 };
int arr3[4] = { 7, 8, 9, 10 };
int *arr[3] = { arr1, arr2, arr3 };
int parr[3][4]={
{ 1, 2, 3, 4 }, //parr[0]
{ 4, 5, 6, 7 }, //parr[1]
{ 7, 8, 9, 10 } //parr[2]
}
✔ 포인터 배열을 2차원 배열로 사용할 수 있는 이유는 포인터 연산때문인데,
✔ 자신이 가리키는 변수의 자료형을 알고 있으므로, 위치를 찾아가 필요한 만큼 값을 읽을 수 있기 때문이다.
✔ 배열의 표현은 아래와 같이 포인터 표현으로 바꾸어 사용할 수 있다.
parr[2][2];
*(parr[2] + 2);
arr3[2];
*(arr3+2)
✔ parr[2] 는 arr3을 가르키는 주소이며, 이 값에 2를 더하면 ary3의 세번째 요소의 주소가 된다.
✔ 즉, arr3[2]의 주소이자 parr[2][2] 의 주소가 된다.
✔ 그리고 이 값에 간접 참조 연산자를 사용하면 저장된 값을 사용할 수 있다.
[참고] 한빛미디어-혼자 공부하는 C언어 유튜브 강의 / 엘리스 트랙-혼자 공부하는 C언어 / 길벗-C언어 코딩 도장 / 위키백과
'BackEnd > C' 카테고리의 다른 글
[20일차] 1. 이중 포인터 (0) | 2021.03.03 |
---|---|
[19일차] 3. 포인터 배열 복습 예제 (0) | 2021.03.02 |
[19일차] 1. 2차원 배열 (0) | 2021.03.02 |
[18일차] 2. 레지스터 변수/주소를 반환하는 함수 (0) | 2021.03.01 |
[18일차] 1. 지역 변수와 전역 변수 (0) | 2021.03.01 |