배열은 같은 타입의 데이터를 묶어서 관리할 수 있게 해준다.
배열의 자료구조에 대한 상세한 사항은 아래 포스트를 참고한다.
다음은 배열을 만드는 예제이다.
int a[10] = {0, }
a는 변수이름이다. int 형 자료를 10개 만든다. 그 안에 있는 값들은 모두 0으로 초기화한다.
#include <stdio.h>
void main(){
int a[10] = {0, };
a[0] = 5;
a[1] = 10;
a[7] = 17;
int length = sizeof(a)/sizeof(a[0]);
for (int i =0; i < length; i++){
printf("array index %d value : %d\n",i, a[i] );
}
}
배열을 만들고 몇개의 값에는 새로운 값을 대입했다. 인덱스를 보면 1에서 시작하는게 아니라 0에서 시작한다. 배열의 선언시에는 10으로 열개를 생성한다고 했는데 인덱스는 0에서 부터 9까지 이다. -1차이 나는 것을 주의한다. 컴퓨터에서는 0부터 저장장소로 사용된다.
다음 줄에서는 sizeof 연산자로 길이를 도출한다. sizeof 배열이름은 배열의 총 크기를 반환한다. 즉 40이다. a[0]이라는 특정의 값에 대해서는 메모리를 차지하는 바이트를 도출한다. 4바이트 이고 40을 4바이트로 나누면 10이된다. 10은 요소의 개수이니 이것으로 배열의 끝까지 for문을 돌릴수 있다.
*이런 경우는 에러가 난다.
int b = 10;
int c[b]; // c의 선언문
C언어 배열의 크기를 정할 때는 상수값이 들어가야 한다. 왜냐하면 배열은 고정된 자료형이기 때문이다. 프로그램의 실행시간(run time) 에 변하는 값들은 HEAP 히프라는 메모리 구조에 들어간다. 배열은 컴파일 시간에 자료의 형태가 고정되서 실행시간에 스택stack 메모리 영역에서 사용된다.
미리 자료의 크기가 정해지지 않으면 컴파일러가 배열을 스택에 배치할 수 없다. 이런 경우는 동적 메모리 할당 방식으로 해결할 수 있다. 관련 내용은 메모리 할당 챕터에서 다룬다.
크기를 정하는게 아닌 일반 대입문은 인덱스에 변수를 써도 무관하다.
int c[5]; // 선언문
int b = 3;
int c[b] = 10; // 할당문이다
*배열의 초기화는 중요하다
초기화를 아래와 같이 해줄 수 있다. 초기화를 하지않으면 쓰레기값을 잘못 사용할 수가 있다. 초기화 전에는 쓸모없는 값(쓰레기 값이라 한다)들이 저장되어 있다.
for 반복문을 사용하는 등 방법은 여러가지가 있지만 이 방법이 제일 편하다. 초기화는 0으로만 사용할 수 있다.
int a[10] ={ 0, }
* 또 다른 초기화 방법
이 방법은 [] 이렇게 명시는 안한다. 그런데 초기화를 하면서 들어가는 요소의 개수로 확정이 된다. 명시를 안할 뿐이지 배열의 크기를 5로 확정한 것이나 마찬가지다.
#include <stdio.h>
void main(){
int a[] = {1,3,5,7,9,11};
int length = sizeof(a)/sizeof(a[0]);
for (int i =0; i < length; i++){
printf("array index %d value : %d\n",i, a[i] );
}
}
배열의 사용법은 이미 알고 있다. 변수처럼 사용하면 된다.
a[0] = 5;
a[1] = 7 + 2;
a[2] = a[1] + a[3];
배열을 하나의 사용자 정의 자료형으로 바라볼 수 있다.
정수형 10개의 배열 이러면 이 자체가 하나의 사용자 정의 자료형이다.
int array[10];
array 형의 각각 요소는 4바이트이므로 10개를 곱하면 40바이트가 된다. 40바이트 짜리 자료형이라 보면 된다. 나중에 구조체나 C++ 이상의 클래스를 보면 사용자가 임의로 정의한 자료라는 것을 알 수 있다. 이것들을 묶는 개념이 type 타잎이다.
#include <stdio.h>
void main(){
char string1[] = "Hello World!";
char string2[] = {'h','a','p','p','y',0};
printf("%s\n", string1);
printf("%s\n", string2);
}
문자열은 char 형 변수가 배열되어 있는 모습니다. 자료형 중에서도 특별하게 다루는 문자열 자료형도 결국은 이진법으로 저장되어야 한다.
C언어는 어차피 char 형이 8비트라 영어만 표현 가능하다. 이러한 방법으로 저장되는 것을 알면 나중에 객체지향언어들을 배울 때 String의 특징에 대하여 더 잘 이해할 수 있을 것이다.
* 이번 C언어 시리즈에서는 2차원 배열은 제외한다.