C언어 :: 포인터와 배열에 대한 이해
C언어 :: 포인터와 배열에 대한 이해
C언어의 포인터와 배열에 대한 이해도를 높일 수 있는 글입니다.
2차원 배열
2차원 배열의 선언방식은 int arr[3][4];
와 같이 1차원 배열의 선언 방식과 매우 유사하다.
1
2
3
4
5
6
7
8
9
int main() {
int arr1[3][4];
int arr2[7][9];
printf("세로3, 가로4: %d \n", sizeof(arr1));
printf("세로7, 가로9: %d \n", sizeof(arr2));
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
int main() {
int villa[4][2];
int popu, i, j;
// 가구별 거주인원 입력 받기
for (i = 0; i < 4; i++) {
for (j = 0; j < 2; j++) {
printf("%d층 %d호 인구 수: ", i + 1, j + 1);
scanf("%d", &villa[i][j]);
}
}
for (i = 0; i < 4; i++) {
popu = 0;
popu += villa[i][0];
popu += villa[i][1];
printf("%d층 인구 수: %d \n", i + 1, popu);
}
return 0;
}
2차원 배열의 메모리상 할당의 형태
컴퓨터의 메모리는 1차원적 구조이기 때문에 다차원 배열이라고 하더라도 메모리상에는 1차원적 구조로 저장될 수 밖에 없다. 다음 프로그램의 출력 결과를 통해 이를 증명할 수 있으며, 배열 요소별 주소 값이 int형 변수의 크기인 4byte 만큼 차이가 남을 알 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
int main() {
int arr[3][2];
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 2; j++) {
printf("%p \n", &arr[i][j]);
}
}
return 0;
}
/*
출력결과
0x16fdff0e0
0x16fdff0e4
0x16fdff0e8
0x16fdff0ec
0x16fdff0f0
0x16fdff0f4
*/
2차원 배열 역시 배열의 길이를 명시하지 않고도 초기화가 가능하지만 제약사항이 존재한다. 다음과 같은 선언이 있다면 컴파일러가 배열의 가로와 세로의 길이를 결정할 수 있는 정보가 부족할 것이다.
int arr[][] = {1, 2, 3, 4, 5, 6, 7, 8};
때문에 2차원 배열을 선언과 동시에 초기화하는 경우에는 다음과 같이 배열의 세로길이만 생략 가능하다.
int arr[][2] = {1, 2, 3, 4, 5, 6, 7, 8};
This post is licensed under CC BY 4.0 by the author.