배열은 같은 타입의 데이터를 묶어서 관리할 수 있게 해준다.

 

배열의 자료구조에 대한 상세한 사항은 아래 포스트를 참고한다.

 

 

자료구조 1 배열의 구조

C의 대표적 자료 구조인 배열에 대하여 알아본다. 배열은 대부분의 언어에 기본으로 장착되어 있는 자료형태이다. 컴퓨터는 모든 데이터를 0과1의 이진 데이터의 형태로 저장한다. 이진법과 C의

digiconfactory.tistory.com

 

다음은 배열을 만드는 예제이다.

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차원 배열은 제외한다.

 

공유하기

facebook twitter kakaoTalk kakaostory naver band