동적 이차원배열

이인혁·2024년 5월 20일

C

목록 보기
18/23

1. 동적으로 만든 이차원배열

만약 동적으로 이차원 배열을 할당한다고 가정해보겠습니다. 앞에서 이차원 배열에 대해서 배울때 이차원배열을 평면으로 생각하면 편하다고 했습니다. 그러나 이차원 배열은 사실 1차원 배열 여러개를 붙여놓은 느낌이었습니다. 또 배열명 자체가 주소값이기 때문에 배열은 포인터와 같은 역할을 하기도 했습니다.

이차원 배열을 동적할당 할때는 먼저 1차원배열을 담을 배열을 먼저 선언합니다. 그리고 각각의 요소에 1차원 배열들을 동적할당하면 됩니다.

예제 한개를 바로 보면서 이해해보겠습니다.
예시

int main() {
	int column = 0;
	int row = 0;
	printf("행의 값을 입력하세요: ");
	scanf_s("%d", &column);
	printf("열의 값을 입력하세요: ");
	scanf_s("%d", &row);
	int** pparray = (int**)malloc(sizeof(int*) * column);
	for (int i = 0; i < column; i++) {
		pparray[i] = (int*)malloc(sizeof(int) * row);
	}
	for (int i = 0; i < column; i++) {
		for (int j = 0; j < row; j++) {
			pparray[i][j] = i * row + j;
		}
	}
	for (int i = 0; i < column; i++) {
		for(int j = 0; j < row; j++) {
			printf("pparray[%d][%d] = %d\n", i, j, pparray[i][j]);
		}
	}
	
	for (int i = 0; i < column; i++) {
		free(pparray[i]);
        //pparray자체를 먼저 반환하면 pparray[0], pparray[1], pparray[2]를 반환못한다.
	}
	free(pparray);
	return 0;
}

결과

행의 값을 입력하세요: 4
열의 값을 입력하세요: 5
pparray[0][0] = 0
pparray[0][1] = 1
pparray[0][2] = 2
pparray[0][3] = 3
pparray[0][4] = 4
pparray[1][0] = 5
pparray[1][1] = 6
pparray[1][2] = 7
pparray[1][3] = 8
pparray[1][4] = 9
pparray[2][0] = 10
pparray[2][1] = 11
pparray[2][2] = 12
pparray[2][3] = 13
pparray[2][4] = 14
pparray[3][0] = 15
pparray[3][1] = 16
pparray[3][2] = 17
pparray[3][3] = 18
pparray[3][4] = 19

결국 이차원배열을 선언한다는 것은 Heap영역에 주소값을 담을 배열을 동적 선언하고, 일차원 배열을 각각 동적 선언하여 이차원 배열에 값으로 이차원 배열의 배열명을 넣습니다.

2. 문제풀이

구구단 중에 앞단수와 뒷단수를 입력받고, 해당 범위의 단수를 저장할 동적배열을 만들고, 값을 저장한 후에 출력해보세요.
예) 2단 5단을 입력하면 2, 3, 4, 5단을 입력할 동적배열을 만들고 구구단을 입력하고 값을 출력

코드1: 동적 이차원 배열

#include <stdio.h>
#include <stdlib.h>

int main() {
	int minRange = 0;
	int maxRange = 0;
	//단수의 범위를 입력하세요
	printf("앞의 단수를 입력하세요: ");
	scanf_s("%d", &minRange);
	printf("뒤의 단수를 입력하세요: ");
	scanf_s("%d", &maxRange);
	int length = maxRange - minRange + 1;
	//동적이차원배열
	printf("동적이차원배열\n");
	int** ppDanarray = (int**)malloc(sizeof(int*) * (length));
	for (int i = 0; i < maxRange - minRange + 1; i++) {
		ppDanarray[i] = (int*)malloc(sizeof(int) * 9);
	}
	for (int i = 0; i < length; i++) {
		for (int j = 0; j < 9; j++) {
			ppDanarray[i][j] = (minRange + i) * (j + 1);
		}
	}
	for (int i = 0; i < length; i++) {
		printf("----%d단----\n", (i + minRange));
		for (int j = 0; j < 9; j++) {
			printf("%d X %d = %d\n", (i + minRange), j + 1, ppDanarray[i][j]);
		}
		printf("\n");
	}
	//int 값 저장용 동적배열 반환처리
	for (int i = 0; i < length; i++) {
		free(ppDanarray[i]);
	}
	//int* 값 저장용 동적배열 반환처리
	free(ppDanarray);
	
	return 0;
}

결과1

동적이차원배열
----2단----
2 X 1 = 2
2 X 2 = 4
2 X 3 = 6
2 X 4 = 8
2 X 5 = 10
2 X 6 = 12
2 X 7 = 14
2 X 8 = 16
2 X 9 = 18

----3단----
3 X 1 = 3
3 X 2 = 6
3 X 3 = 9
3 X 4 = 12
3 X 5 = 15
3 X 6 = 18
3 X 7 = 21
3 X 8 = 24
3 X 9 = 27

----4단----
4 X 1 = 4
4 X 2 = 8
4 X 3 = 12
4 X 4 = 16
4 X 5 = 20
4 X 6 = 24
4 X 7 = 28
4 X 8 = 32
4 X 9 = 36

----5단----
5 X 1 = 5
5 X 2 = 10
5 X 3 = 15
5 X 4 = 20
5 X 5 = 25
5 X 6 = 30
5 X 7 = 35
5 X 8 = 40
5 X 9 = 45

코드2: 동적일차원배열

#include <stdio.h>
#include <stdlib.h>

int main() {
	int minRange = 0;
	int maxRange = 0;
	//단수의 범위를 입력하세요
	printf("앞의 단수를 입력하세요: ");
	scanf_s("%d", &minRange);
	printf("뒤의 단수를 입력하세요: ");
	scanf_s("%d", &maxRange);
	int length = maxRange - minRange + 1;
	//동적일차원배열
	printf("동적일차원배열\n");
	int* pgugudan = (int*)malloc(sizeof(int) * length * 9);
	int(*gugudanArray)[9] = (int(*)[9])pgugudan;//int* -> int(*)[9]
	for (int i = 0; i < length; i++) {
		for (int j = 0; j < 9; j++) {
			gugudanArray[i][j] = (i + minRange) * (j + 1);
		}
	}
	for (int i = 0; i < length; i++) {
		printf("----%d단----\n", i + minRange);
		for (int j = 0; j < 9; j++) {
			printf("%d x %d = %d\n", i + minRange, j + 1, gugudanArray[i][j]);
		}
		printf("\n");
	}
	//동적배열 반환처리
	free(gugudanArray);
	return 0;
}

결과2

앞의 단수를 입력하세요: 2
뒤의 단수를 입력하세요: 5
동적일차원배열
----2단----
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18

----3단----
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27

----4단----
4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36

----5단----
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45

3. 포인터 배열

지금까지 동적이차원 배열에 대해서 알아보았는데 사실상 동적으로 포인터배열을 선언한것과 같습니다. 문자열에서의 포인터 배열은 무엇이 있을까요?

Rectangle 배열Ragged 배열이 있습니다. 차이는 Rectangle 배열은 2차원배열에 그대로 값을 넣는다고 한다면, Ragged 배열은 포인터배열로써, 배열안에 1차원 배열의 주소값을 넣습니다.

예시

#include <stdio.h>

int main() {
	char fruitArray[4][10] = { "Apple", "Banana", "PineApple", "Mango" };//Rectangle 배열
	
    char* pfruit1 = "Apple";
	char* pfruit2 = "Banana";
	char* pfruit3 = "PineApple";
	char* pfruit4 = "Mango";
	char** ppfruitArray[] = { pfruit1, pfruit2, pfruit3, pfruit4 };//Ragged배열
	
    printf("----Ragged배열----\n");
	int length = sizeof(ppfruitArray) / sizeof(ppfruitArray[0]);
	for (int i = 0; i < length; i++) {
		printf("%s\n", ppfruitArray[i]);
	}
	
    printf("\n----Rectangle배열----\n");
	for (int i = 0; i < 4; i++) {
		printf("fruitArray[%d] = %s\n", i, fruitArray[i]);
	}
    
	return 0;
}

결과

----Ragged배열----
Apple
Banana
PineApple
Mango

----Rectangle배열----
fruitArray[0] = Apple
fruitArray[1] = Banana
fruitArray[2] = PineApple
fruitArray[3] = Mango
profile
게임개발공부블로그

0개의 댓글