라떼는말이야

[C 기초] 이중 포인터를 사용한 2차원 배열 접근 본문

알고리즘/CS50

[C 기초] 이중 포인터를 사용한 2차원 배열 접근

MangBaam 2021. 3. 12. 10:00
반응형

www.notion.so/1-b8430429b95b49ac9a94f51b9c9b134f

 

✔︎ 미션 1.

1. 미션 제목

www.notion.so

1. 미션 제목

포인터를 이중으로 활용해보자

2. 지시문

유사 문제에서 배열을 포인터로 접근하는 방법을 학습하였습니다. 2차원 배열(5x5)을 선언한 후 포인터로 접근하여서 순서대로 출력하는 코드를 작성해보세요

 

Int arr[6][5]={{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}};

 

배열의 값을 접근할 경우 arr[m][n] 또는 포인터로 접근할 수 있습니다. 2차 배열의 경우 이중 포인터로 접근할 수 있으니 활용해보시길 바랍니다. 이중 For문을 활용하시면 쉽게 접근할 수 있습니다.

 

예)

출력값:

26    27    28    29    30

21    22    23    24    25

6    7    8    9    10

1    2    3    4     5

3. 핵심 개념

#이중포인터 #루프

 

나의 풀이

#include<stdio.h> 

int main() {
	int arr[6][5] = { {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} };

	int m = sizeof(arr) / sizeof(arr[0]); // 행의 개수
	int n = sizeof(arr) / m / sizeof(arr[0][0]); // 열의 개수

	for (int i = m - 1; i >= 0; i--) {
		for (int j = 0; j < n; j++) {
			printf("%2d\t", *(*(arr + i) + j)); // arr[i][j]의 포인터 표현
		} printf("\n");
	}

	return 0;
}

arr[0]은 {1, 2, 3, 4, 5}를 나타내므로 arr의 크기에서 arr[0]의 크기로 나누면 행의 크기를 알 수 있다.

arr[0][0]은 {1}을 나타내므로 arr를 행의 크기로 나눠서 행 하나의 크기를 구하고 arr[0][0]으로 나누면 열의 크기를 알 수 있다. sizeof(arr[0][0]) 대신 sizeof(int)를 사용해도 되지만 다른 데이터 타입에서도 사용 가능한 일반화 된 모습을 위해 arr[0][0]의 크기로 나눴다.

 

arr[i][j]를 포인터로 표현하면 *( *( arr + i ) + j ) ) 로 나타낼 수 있다.

 

5행부터 0행 순으로 출력하므로 m-1부터 0까지 순회하도록 반복문을 작성했다.

반응형
Comments