배열
: 할당값을 전부 사용할 때 필요
같은 데이터형의 변수를 메모리에 연속적으로 할당하고 같은 이름으로 사용하는 기능
배열의 원소(element) : 배열 안에 들어가는 변수 하나하나
인덱스(index) : 배열의 각 원소를 구분하기 위해
보통 대부분의 프로그래밍 언어에서 배열의 인덱스가 0부터 시작하듯이 C 또한 항상 0부터 시작한다.
원소마다 값을 따로 저장하여, 각각을 개별적인 변수처럼 사용할 수 있다.
배열의 모든 원소는 항상 연속된 메모리에 할당된다.
배열의 선언
배열을 선언하려면 배열 원소의 데이터형과 배열 이름을 쓰고 [] 안에 배열 크기를 지정한다.
배열의 크기는 배열에 들어있는 원소의 개수를 뜻한다.
형식 - 데이터형 배열명 [크기]
ex - int num[5];
double data[100];
char name[32];
배열의 크기는 항상 0보다 큰 저우형 상수로 지정되어야 한다.
배열의 크기 지정은 리터럴 상수/ 매크로 상수 모두 가능하다.
const 변수는 변수이므로 배열의 크기를 지정할 때는 사용할 수 없다.
sizeof연산자를 배열 명에 대해 사용하여 배열의 크기를 구할 수 있다.
예시로 배열명이 arr이라면 sizeof(arr)는 배열 전체의 바이트 크기이다.
sizeof연산자를 통해 배열 명으로부터 배열의 크기(원소의 개수)를 구할 수 있다.
arr이 배열명일때 'sizeof(arr)/ sizeof(arr[0])'은 항상 배열의 크기가 된다.
'배열 전체 바이트 수/ 원소 하나의 바이트 수'
배열의 초기화
배열을 초기화하려면 { }안에 배열 원소의 초기값을 콤마(,)로 나열한다
초기값이 모자란 나머지 원소는 0으로 초기화한다.
초기값을 원소의 개수보다 많이 지정시 컴파일 에러가 발생한다.
배열 전체를 0으로 초기화하려면 { } 안에 0을 써준다. 초기값이 따로 없다면 0으로 초기화
(1) 배열 원소의 사용
배열의 각 원소에 접근하려면 인덱스나 첨자를 이용한다.
배열은 주로 for문과 함께 사용된다.
배열의 인덱스에는 변수나 변수를 포함한 수식을 사용할 수 있다.
배열을 사용할 때는 배열의 인덱스가 유효 범위를 넘어서지 않도록 주의해야한다.
배열의 인덱스는 항상 0~(배열의 크기 - 1) 사이의 값이다.
(2) 배열의 복사
우선 배열이 무엇인지 한번 더 짚고 넘어가면, 배열은 같은 타입을 모아둔 것이다.
원소의 데이터형과 배열의 크기가 같은 경우에도 배열을 다른 배열에 대입할 수는 없다.
배열을 다른 배열에 대입할 수는 없지만, for문을 통해 배열 원소를 다른 배열의 원소에 대입할 수는 있다.
배열의 모든 원소에 대해 원소끼리 대입하면 배열 전체를 복사하게 된다.
(3) 배열의 비교
두 배열이 같은지 비교하기 위해서 == 연산자로 직접 배열을 비교하면 원하는 결과를 얻을 수 없다.
인덱스 없이 배열 이름만 사용하면 배열의 시작 주소를 의미한다. 배열의 시작 주소는 바뀔 수 없다.
배열의 내용이 같은지 비교하려면 for문을 통해 인덱스 번호를 통해 원소끼리 비교해야 한다.
배열의 활용
배열의 탐색과 정렬
탐색(search) : 주어진 데이터 중에서 특정 값을 가진 항목을 찾는 기능
정렬(sort) : 주어진 데이터를 조건에 따라 나열하는 기능
순차 탐색(sequential search) : 배열의 0번째 원소부터 순서대로 탐색키와 비교해서 값이 일치하는 원소를 찾는 방법
순차 탐색 알고리즘
#include<stdio.h>
int main(void)
{
int data[] = { 78, 34, 52, 15, 63, 15, 25 };
int size;
int key, i;
size = sizeof(data) / sizeof(data[0]);
printf("arr = ");
for (i=0; i<size ; i++)
printf("%d ", data[i]);
printf("\n");
printf("찾을 값(키)? "):
scanf("%d", &key);
for ( i=0; i<size; i++)
if (data[i] == key)//
printf("찾은 원소의 인덱스 : %d\n",i);
return 0;
}
배열의 정렬
선택 정렬(selection sort) : 전체 배열의 원소 중 가장 작은 값을 찾아서 배열의 첫 번째 위치로 옮기고, 그 다음 작은 값을 찾아서 배열의 두 번째 위치로 옮기는 식으로 정렬하는 방법
선택 정렬
#include<stdio.h>
#define SIZE 5
int main(void)
{
int data[SIZE] = { 7, 3, 9, 5, 1};
int i, j;
int index, temp;
for(i=0; i<SIZE - 1; i++) //0~(i-1)까지는 정렬된 상태이다.
{
index = i; //정렬할 배열 중 가장 작은 원소의 인덱스
for( j=i+1; j<SIZE-1;i++){
//data[i]~data[SIZE-1]중 가장 작은 원소의 인덱스를 index에 저장
if(data[index] > data[j]) //오름차순 정렬
index = j;
}
//i번째 원소를 index에 있는 원소와 맞바꿈
if(i!=index){
temp = data[i];
data[i]=data[index];
data[index]=temp;
} //i번째 원소가 i번째로 작은 값이 된다.
}
printf("정렬 후 : " );
for(i=0; i<SIZE; i++)
printf("%d ", data[i]);
printf("\n");
return 0;
}
21,22,23라인을 통해 인덱스 안에 있는 값을 맞바꾼다.
위 코드에서 내림차순으로 선택정렬을 하려한다면 if(data[index] > data[j])의 부등호를 if(data[index] < data[j])로 바꿔주면 된다.
다차원 배열
n차원 배열도 1차원 배열처럼 인덱스를 여러 개 사용할 때는 가장 우측 인덱스부터 증가되고, 가장 우측 인덱스가 모두 증가되면 그 다음 왼쪽에 있는 인덱스가 증가된다.
다차원 배열에서도 초기값을 생략하면 나머지 원소를 0으로 초기화한다.
2차원 배열도 초기값 지정에 있어 배열의 행 크기 생략이 가능하나, 2차원 배열의 열 크기는 생략할 수 없다.
열 크기가 있어야 주어진 초기값을 몇 개씩 묶을지 파악 가능하기 때문이다.
함수의 매개변수로 배열을 선언할 때는 배열의 크기를 생략한다.
배열명은 주소라서 []안에 못쓴다.
함수의 매개변수로 사용된 배열은 배열이 아닌 포인터이다. 다른 함수의 또 다른 매개변수를 통해서만 배열의 크기를 받아와야 한다는 점을 인지하자.
'Language & Framework & GIT > C' 카테고리의 다른 글
[씨앤씨뿔] C/ 포인터 - 2 (0) | 2023.04.08 |
---|---|
[씨앤씨뿔] C/ 포인터 - 1 (0) | 2023.04.06 |
[씨앤씨뿔] C/ 함수 (0) | 2023.04.04 |
[씨앤씨뿔] C/ 제어문 (0) | 2023.03.28 |
[씨앤씨뿔] C/ 연산자 (0) | 2023.03.27 |
댓글