C언어 복습2 - 배열

seri·2021년 3월 15일
0

C언어 공부

목록 보기
2/2
post-custom-banner

배열과 응용

배열

  • 같은 자료형의 변수를 일렬로 늘어놓은 형태다.
  • 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);
    }
}
profile
https://2unbini.github.io 로 오세용
post-custom-banner

0개의 댓글