C언어 공부 0007
배열
배열이란
- 동일한 자료형의 데이터가 여러 개 저장되어 있는 데이터 저장 장소
- 즉, 하나의 이름으로 제어할 수 있으므로 조작이 편리하다.
- 크기 n개의 배열은
자료형 배열이름[n];
를 이용해 선언하고, 아래와 같이 나타낼 수 있다.
배열이름[0] | 배열이름[1] | 배열이름[2] | ... | ... | ... | 배열이름[n-1] |
- 각각의 데이터들은 정수로 되어 있는 번호(인덱스)에 의하여 접근 및 조작
- 인덱스는 항상 0부터 시작
- 예를 들어 3번째 칸에 있는 원소에 접근하려면
배열이름[2]
와 같이 사용
- 인덱스가 배열의 크기를 벗어나게 되면 오류가 발생한다.
- 배열의 크기를 알고싶다면,
sizeof(배열이름) / sizeof(배열이름[0])
를 이용하여 구할 수 있다.- sizeof함수는 어떤 변수나 자료형, 값이 차지하는 메모리 공간 크기를 알려주고, 이를 이용해
배열 전체의 차지공간 / 배열 원소 하나의 차지공간
을 이용하면 구하는 것이 가능하다.
- sizeof함수는 어떤 변수나 자료형, 값이 차지하는 메모리 공간 크기를 알려주고, 이를 이용해
배열의 필요성
- 개별적인 변수 사용보다 하나의 변수에 다수의 값을 저장하고 싶은 경우
- 여러 값들을 정렬, 탐색 등의 다량의 데이터 속에서 특정 데이터의 접근이 필요한 경우
- 통계 계산 등의 수학적 작업이 필요한 경우
다양한 배열의 초기화 방법들
int grade[5] = {1, 2, 3, 4, 5};
: 5칸의 배열을 선언하고, 5칸 각각의 값을 저장한다.int grade[5] = {1, 2, 3};
: 5칸의 배열을 선언했지만, 앞의 3칸에만 값을 저장한다. 이 경우, 남은 2칸의 값은 자동으로 0으로 저장된다.int grade[] = {1, 2, 3, 4, 5};
: 배열의 크기는 선언하지 않았지만, 5개의 값을 저장한다. 이 경우, 배열의 크기는 5로 지정된다.- 반복문을 이용한 방법 : 각각의 원소를 인덱스를 이용해 접근하여 값을 저장한다.
for(i = 0; i < 5; i++)
{
grade[i] = k;
}
2차원 배열
- 주로 수학에서 배열을 이용한 계산이나, 표를 그리기 위해 1차원 배열이 쌓인 형태의 2차원 배열을 만들어 이용할 수 있다.
- 차원이 2개 이므로, 색인 또한 2개가 필요하다.
- n * m 크기의 배열은
자료형 배열이름[n][m];
를 이용해 선언하고, 아래와 같이 나타낼 수 있다.
배열이름[0][0] | 배열이름[0][1] | 배열이름[0][2] | ... | ... | ... | 배열이름[0][m-1] |
배열이름[1][0] | 배열이름[1][1] | 배열이름[1][2] | ... | ... | ... | 배열이름[1][m-1] |
배열이름[2][0] | 배열이름[2][1] | 배열이름[2][2] | ... | ... | ... | 배열이름[2][m-1] |
... | ... | ... | ... | ... | ... | ... |
... | ... | ... | ... | ... | ... | ... |
... | ... | ... | ... | ... | ... | ... |
배열이름[n-1][0] | 배열이름[n-1][1] | 배열이름[n-1][2] | ... | ... | ... | 배열이름[n-1][m-1] |
다양한 2차원 배열의 초기화 방법들
int s[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
: 3*4칸의 배열을 선언하고, 모든 칸 각각의 값을 저장한다.int s[][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
: n*4칸의 배열을 선언했지만, 3*4개의 값을 저장한다. 이 경우, 배열의 크기는 3*4로 지정된다.int s[][4] = {{0, 1}, {4, 5}, {8, 9}};
: n*4칸의 배열을 선언했지만, 각 행의 앞 2칸에만 값을 저장한다. 이 경우, 배열의 크기는 3*4로 지정되며, 남은 2칸의 값은 자동으로 0으로 저장된다.- 반복문을 이용한 방법 : 각각의 원소를 인덱스를 이용해 접근하여 값을 저장한다.
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
s[i][j] = k;
}
}
- 선언시 열의 개수는 주어야 컴파일러가 배열의 크기를 알 수 있다.
n차원 배열
- 배열은 얼마든지 차원을 늘리는것이 가능하다.
예제를 통한 배열 연습
최소값 탐색
- 코드
#include <stdio.h>
#define SIZE 5
int main()
{
int val[SIZE] = {20, 50, 40, 70, 30};
int i, minVal;
minVal = val[0];
for(i = 1; i < SIZE; i++)
{
if(val[i] < minVal)
{
minVal = val[i];
}
}
printf("Minimum value is %d.\n", minVal);
return 0;
}
- 출력
20
순차 탐색을 이용한 배열에서 특정 값의 위치 찾기
- 코드
#include <stdio.h>
#define SIZE 5
int main()
{
int list[SIZE] = {1, 2, 3, 4, 5};
int key = 4;
int i;
for(i = 0; i < SIZE; i++)
{
if(list[i] == key)
{
printf("Find -- Array[%d] value is %d.\n", i, key);
return 1;
}
}
printf("Can not Find.\n");
return 0;
}
- 출력
Find -- Array[3] value is 4.
정렬
- 코드
#include <stdio.h>
#define SIZE 10
int main()
{
int list[SIZE] = {3, 2, 9, 7, 1, 4, 8, 0, 6, 5};
int i, j, temp, least;
for(i = 0; i < SIZE-1; i++)
{
least = i; // i번째 값을 최소값으로 가정
for(j = i + 1; j < SIZE; j++) //최소값탐색
{
if(list[j] < list[least])
{
least = j;
}
}
// i번째 원소와 least 위치의 원소를 교환
temp = list[i];
list[i] = list[least];
list[least] = temp;
}
for(i = 0;i < SIZE; i++)
{
printf("%d ", list[i]);
}
printf("\n");
return 0;
}
- 출력
0 1 2 3 4 5 6 7 8 9