배열과 응용
배열
- 같은 자료형의 변수를 일렬로 늘어놓은 형태다.
- int arr[10] = {1, 2, 3, ... , 9, 10}; 과 같이 선언하고 초기화한다. 한 번 {} 를 이용해 초기화된 배열은 다시 {} 를 이용해 초기화할 수 없다.
- 배열의 인덱스는 0부터 시작한다. 즉, 배열의 길이가 10일 때, 배열의 인덱스는 0부터 시작해 9로 끝난다.
- 배열과 포인터는 동일하게 작동하기 때문에, 배열의 인덱스로 특정 위치의 값을 알 수 있는 것처럼, 포인터도 인덱스를 통해 특정 위치의 값에 접근할 수 있다.
- 배열의 크기는 sizeof(arr)/sizeof(int) 로 구할 수 있다.
다차원 배열
2차원 배열
- int arr[r][c]; 과 같이 표현되며, r 과 c 는 각각 세로크기, 가로크기다. 세로크기는 행의 개수(row)이고, 가로크기는 열의 개수(column)이다.
- int (*ptr)[c]; 는 2차원 배열을 넣을 수 있는 포인터다.
- 이 때, (ptr)[c] 와 ptr[c] 를 꼭 잘 구분해야 한다! 전자는 배열의 포인터, 후자는 포인터 배열이다.
- 세로크기, 가로크기를 구하는 공식은 다음과 같다
sizeof(arr)/sizeof(arr[0]);
sizeof(arr[0])/sizeof(int);
3차원 배열
- int arr[d][r][c]; 와 같이 표현되며, d, r, c 는 각각 깊이, 세로크기, 가로크기다. 평면 구조인 2차원 배열과 달리 3차원 공간으로 표현되며, 그 구분이 맨 앞 [d]에 따른다는 점을 기억하면 된다.
- (*ptr)[r][c]; 는 3차원 배열을 넣을 수 있는 포인터다.
- 높이, 세로크기, 가로크기
sizeof(arr)/sizeof(arr[0]); => 배열의 전체를 한 면의 크기로 나누기
sizeof(arr[0])/sizeof(arr[0][0]);
sizeof(arr[0][0])/sizeof(int);
포인터를 배열처럼 사용
- 포인터에 메모리를 할당한 뒤, []에 인덱스를 저장하면 배열처럼 사용할 수 있다.
int *ptr = malloc(sizeof(int) * n);
- 2차원 배열처럼 사용하려면, 이중 포인터를 선언해 세로 공간을 만들어준 뒤, 반복문을 통해 가로 공간을 만들어주면 된다.
- 메모리 해제는 역순으로(반복문으로 가로공간 해제->세로공간 해제) 하면 된다.
int m, n (각 세로크기, 가로크기)
int **ptr = malloc(sizeof(int*)*m);
for(int i=0; i<m; i++){
ptr[i] = malloc(sizeof(int)*n);
}
- 3차원 배열처럼 사용하려면, 면 -> 세로공간 -> 가로공간 순으로 메모리를 할당해주면 된다.
int h, m, n (각 높이, 세로크기, 가로크기);
int ***ptr = malloc(sizeof(int**)*h);
for(int i=0; i<h; i++){
ptr[i] = malloc(sizeof(int*)*m);
for(int j=0; j<m; j++){
ptr[i][j] = malloc(sizeof(int)*n);
}
}