티스토리 뷰

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언어 코딩 도장 / 위키백과

 

댓글
«   2024/12   »
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
최근에 올라온 글
글 보관함
Total
Today
Yesterday