5주차 배열!
c언어의 배열은 같은 자료형의 데이터를 메모리에 연속적으로 저장하는 고정된 크기의 자료 구조이다.
배열은 다음과 같이 선언할 수 있다.
int a[5] = {1, 2, 3, 4, 5}
위의 코드는 int 형 데이터를 5개 저장할 수 있는 배열을 선언하고 그 안에 1부터 5까지의 정수를 순서대로 저장하도록 배열을 초기화하는 코드이다.
5개의 정수를 저장하기 위해 a1 ~ a5 까지의 int 변수를 각각 만들 수도 있지만 배열을 사용하여 메모리 상에 연속된 공간에 저장하고 인덱스로 쉽게 접근할 수 있다.
따라서 위의 배열은 4바이트 int 저장 공간이 5개 연속되어 20바이트의 연속된 메모리 공간을 차지한다. (환경에 따라 int형 변수의 크기는 다르르 수 있음)
a = |1|2|3|4|5|
index 0 1 2 3 4
배열이 저장하는 값들을 배열 요소(element)라고 하는데 앞서 말했듯이 인덱스로 접근이 가능하다. 인덱스는 0부터 시작해 배열 크기 - 1에서 끝난다. 따라서 첫번째 배열 요소는 a[0]으로 접근할 수 있다. 인덱스의 범위를 벗어난 코드를 작성하지 않도록 조심해야 한다.
배열은 위의 코드와 같이 선언과 동시에 초기화 되어야 한다.
다른 변수와 같이 선언된 뒤에 초기화할 수 없고 이후 대입 연산자로 값을 변경할 수 없다.
즉, 아래와 같은 코드는 컴파일 에러가 발생한다.
int a[5];
a = {1, 2, 3, 4, 5}
배열을 초기화 방법을 몇 가지 알아보자
기본
int a[5] = {1, 2, 3, 4, 5}
배열의 크기보다 적은 수의 배열 요소로 초기화
int a[5] ={1, 2, 3} 첫 번재 요소부터 초기화 되고 나머지는 0으로 초기화 됨
자동 초기화
int a[999] = {0} 모든 요소를 0으로 초기화
배열 크기 생략
int a[] = {1, 2, 3} ㅇ컴파일러가 초깃값의 개수로 배열 크기 할당
int형 말고도 다른 자료형을 저장하는 배열을 선언하고 사용할 수 있다.특히 c언어는 char 형 배열을 사용하여 문자열을 다룬다.
배열은 연속된 저장 공간이기 때문에 반복문을 사용하여 쉽게 처리할 수 있다.
아까 말한 문자 배열이다. c언어에서 문자 배열 = 문자열이다.
문자 배열은 저장하려는 문자열 길이 보다 최소 하나 이상 큰 배열로 선언되어야 한다.
왜 그럴까?
바로 널 문자 '\0'를 사용해 문자열의 끝을 컴파일러에게 알리기 위해서다.
널 문자는 아래 아스키 코드상에서 숫자 0이다. 배열에 0을 저장하면 문자열에서는 널 문자로 해석되고 문자열의 끝난 것으로 약속한 것이다.
아스키 코드
출처: https://sheepone.tistory.com/47
예를 들어 문자열을 출력할 때 널문자가 나오면 거기까지만 출력하도록 한다.
배열의 값은 계속 달라질 수 있는데, 긴 문자열을 저장했다가 더 짧은 문자열을 저장하는 경우를 생각해보자
|C|i|s|t|h|e|b|e|s|p|r|o|g|r|a|m|m|i|n|g|l|a|n|g|u|a|g|e|\0|
이렇게 저장된 배열에 scanf 함수로 배열의 값을 I agree로 변경하면(띄어쓰기는 하지 않는다고 가정하자)
앞에서부터
|I|a|g|r|e|e|\0|e|s|p|r|o|g|r|a|m|m|i|n|g|l|a|n|g|u|a|g|e|\0|
이런 식으로 변경되어 printf로 출력하면 Iagree만 출력된다.
실제 코드를 작성해보자.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void main() {
char string[] = "orangeman";
printf("원래 문자 배열: %s\n", string);
printf("변경할 문자열: ");
scanf("%s", string);
printf("변경 후 배열 출력: %s\n", string);
printf("배열 전체에 저장된 값: ");
for (int i = 0; i < (sizeof(string) / sizeof(string[0])) - 1; i++)
{
if (string[i] == '\0')
printf(" "); //널 문자는 빈칸출력
else
printf("%c", string[i]);
}
printf("\n");
}
출력 결과
널 문자에 대해 다시 정리하면 아스키 코드상에서 첫번째 문자로서 숫자로는 0이지만 문자로 해석될 때 문자열의 끝을 알리는데 사용된다.
'\0' 또는 NULL로 표기할 수 있다.