티스토리 뷰
반응형
C언어 기초 Chapter 17~18: 다차원 배열과 포인터의 관계 완전 정리
Chapter 17. 다차원 배열
17-1. 다차원 배열의 이해와 활용
2차원 배열 선언
int arr[3][4]; // 3행 4열 배열
초기화
int arr[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
👉 메모리에는 행 순서대로 저장됨
2차원 배열 출력
#include <stdio.h>
int main(void) {
int arr[2][3] = {{1,2,3},{4,5,6}};
for (int i=0; i<2; i++) {
for (int j=0; j<3; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
출력:
1 2 3
4 5 6
17-2. 3차원 배열
선언 및 초기화
int cube[2][2][2] = {
{{1,2},{3,4}},
{{5,6},{7,8}}
};
👉 인덱스로 접근
printf("%d\n", cube[1][0][1]); // 6
Chapter 18. 다차원 배열과 포인터의 관계
18-1. 2차원 배열과 포인터의 관계
- 2차원 배열의 이름은 첫 번째 행의 주소
- arr[i] 는 i번째 행(1차원 배열)의 주소
- arr[i][j] 는 i행 j열 원소 값
예제:
#include <stdio.h>
int main(void) {
int arr[2][3] = {{1,2,3},{4,5,6}};
int (*p)[3] = arr; // 열 크기 3인 배열을 가리키는 포인터
printf("%d\n", p[0][1]); // 2
printf("%d\n", *(*(p+1)+2)); // 6
return 0;
}
18-2. 2차원 배열의 특성과 주의사항
- 함수에 2차원 배열 전달 시, 열 크기를 반드시 명시해야 함
void printArray(int arr[][3], int rows) {
for (int i=0; i<rows; i++) {
for (int j=0; j<3; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
👉 호출
int main(void) {
int nums[2][3] = {{1,2,3},{4,5,6}};
printArray(nums, 2);
return 0;
}
⚠️ int arr[][] 처럼 두 번째 크기를 생략하면 컴파일 오류 발생
핵심 정리 ✅
- 다차원 배열은 행렬/표 데이터 표현에 유용
- 3차원 배열은 “배열의 배열의 배열”
- 2차원 배열의 이름은 첫 행의 주소
- 함수에 2차원 배열 전달 시 열 크기를 반드시 지정해야 함
- 포인터 연산을 사용하면 arr[i][j] = *(*(arr+i)+j) 와 동일
연습 문제 ✍️
- 2행 3열 배열을 선언하고 모든 원소의 합을 구하세요.
- 3x3 배열을 선언하고 대각선 합(↘ 방향)을 구하세요.
- 2차원 배열을 함수에 전달해 모든 원소를 출력하는 함수를 작성하세요.
- 포인터 연산만 이용하여 2차원 배열 { {1,2,3}, {4,5,6} } 의 모든 원소를 출력하세요.
👉 연습문제 정답은? ▼
Chapter 17~18 연습문제 풀이
1) 2행 3열 배열을 선언하고 모든 원소의 합 구하기
#include <stdio.h>
int main(void) {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
int sum = 0;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
sum += arr[i][j];
}
}
printf("배열의 합 = %d\n", sum);
return 0;
}
👉 출력: 배열의 합 = 21
2) 3x3 배열 선언하고 대각선 합 구하기 (↘ 방향)
#include <stdio.h>
int main(void) {
int arr[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int sum = 0;
for (int i = 0; i < 3; i++) {
sum += arr[i][i]; // 대각선 원소 (i,i)
}
printf("대각선 합 = %d\n", sum);
return 0;
}
👉 출력: 대각선 합 = 15
3) 2차원 배열을 함수에 전달해 모든 원소 출력하기
#include <stdio.h>
void printArray(int arr[][3], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main(void) {
int nums[2][3] = {{10, 20, 30}, {40, 50, 60}};
printArray(nums, 2);
return 0;
}
👉 출력:
10 20 30
40 50 60
4) 포인터 연산만 이용해 2차원 배열 { {1,2,3}, {4,5,6} } 출력하기
#include <stdio.h>
int main(void) {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
int (*p)[3] = arr; // 열 크기가 3인 배열을 가리키는 포인터
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", *(*(p + i) + j));
}
printf("\n");
}
return 0;
}
👉 출력:
1 2 3
4 5 6
핵심 정리 ✅
- 2차원 배열 합 → 중첩 for문으로 모든 원소 더하기
- 대각선 합 → arr[i][i] 패턴 이용
- 함수 전달 시 열 크기 반드시 지정 필요
- 포인터 연산: arr[i][j] ↔ *(*(arr+i)+j) 동일
반응형
'[문법] C언어' 카테고리의 다른 글
12) C언어 함수 포인터와 void 포인터 완전정리 (2) | 2025.09.02 |
---|---|
10) C언어 포인터의 포인터: 이중 포인터 개념, 함수 활용, 동적 메모리 할당 (0) | 2025.09.02 |
9) C언어 포인터와 함수: 배열 전달, Call by Value vs Reference, const 정리 (2) | 2025.09.01 |
8) C언어 포인터와 배열 완전정리: 관계, 연산, 문자열, 포인터 배열 (2) | 2025.09.01 |
7) C언어의 1차원 배열과 포인터에 대해 알아보자 (2) | 2025.09.01 |