배열은 다수의 데이터를 저장하고 처리하기 위한 자료구조이다.
배열은 1차원일수도, 다차원일 수도 있다.
먼저 1차원 배열에 대해 공부하겠다.
배열을 생성할 때 배열 원소의 자료형, 배열 이름, 배열 길이를 선언해주어야 한다.
int a1[30]; //길이가 30인 int형 1차원 배열 a1
double a2[5]; //길이가 5인 double형 1차원 배열 a2
위와 같이 선언한다. 배열을 생성하면 각 원소들은 나란히 연속적인 공간에 저장된다.
접근할 때에는 인덱스를 이용한다. 인덱스는 1이 아닌 0부터 시작한다.
다음의 예시를 보자.
#include <stdio.h>
int main(void) {
int arr[5];
for (int i = 0; i < sizeof(arr) / 4; i++)
arr[i] = i + 1;
for (int i = 0; i < sizeof(arr) / 4; i++)
printf("%d ", arr[i]);
return 0;
}
1 2 3 4 5
직접 원소 하나를 지정하여 접근할 수 있고, 위과 같이 반복문을 이용하여 간단히 접근도 가능하다.
배열은 선언과 동시에 초기화 또한 가능하다.
다음과 같이 작성하면 된다.
int arr[5] = {10 ,20, 30, 40, 50}
만약 전부 채우지 않고 일부만 채운다면 나머지는 0으로 초기화된다.
다음 예제를 통해 확인할 수 있다.
#include <stdio.h>
int main(void) {
int arr1[5] = {1, 2, 3, 4, 5};
int arr2[5] = { 1, 2, 3};
for (int i = 0; i < sizeof(arr1) / 4; i++)
printf("%d ", arr1[i]);
printf("\n");
for (int i = 0; i < sizeof(arr2) / 4; i++)
printf("%d ", arr2[i]);
return 0;
}
1 2 3 4 5
1 2 3 0 0
배열 선언과 동시에 초기화하는 경우, 배열 길이를 기재하지 않아도 생성 가능하다.
#include <stdio.h>
int main(void) {
int arr1[ ] = {1, 2, 3, 4, 5};
for (int i = 0; i < sizeof(arr1) / 4; i++)
printf("%d ", arr1[i]);
return 0;
}
1 2 3 4 5
배열의 크기를 기재하지 않아도 리스트를 보면 알 수 있기 때문에 이러한 특성은 쉽게 납득이 간다.
❗예시들을 보면 알 수 있듯이 sizeof함수를 사용하면 배열 원소의 개수가 아닌 길이를 반환하기 때문에 자료형 크기만큼 나눠주어야 원소의 개수, 즉 크기를 알 수 있다.
C언어에서는 큰 따옴표를 이용해 문자열을 표현한다.
char str[ ] = "It's friday";
sizeof함수를 통해 길이를 출력한 결과, 12가 나왔다.
이 문자열의 길이는 12바이트이다. 문자열의 끝에 특수문자 '\0'
가 자동으로 삽입되었기 때문이다.
이 자동으로 삽입되는 '\0'
는 null 문자로, 아스키 코드 값이 0인 문자이다. 널 문자를 문자열 형태로 출력하면 아무것도 출력되지 않지만, 아스키 코드 값이 32인 공백문자 ' '와는 다른 문자임을 간과하면 안된다.
scanf 함수로 문자열을 입력받을 때에는 문자열 출력과 마찬가지로 서식문자 %s를 사용한다.
char str[50];
scanf("%s", str);
위과 같이 작성하면 되는데, 변수를 통해 데이터를 입력받을 때와는 다르게 배열 이름 앞에 &를 붙이지 않는다. 이는 배열의 이름이 이미 주소값을 가리키고 있기 때문이다.(후에 자세히 공부할 것이다.)
키보드를 통해 입력받은 문자열에도 역시 널 문자 '\0'
가 자동으로 포함되어 저장된다.
문자열의 맨 끝에는 무조건 널 문자가 포함된다. 널 문자가 붙어있지 않다면 문자열이 아닌 문자의 나열일 뿐이다.
널 문자는 문자열의 끝을 보여주는 지표이다. 따라서 널 문자를 문자열에 삽입함으로써 문자열의 끝을 변경할 수도 있다.