지금까지 다뤄온 변수들은 모두 scalar로, 하나의 아이템만을 가진 변수들. 여기서는 변수들의 집단(aggregate)을 다룸.

C에서의 변수 집단은 두 가지로 나눌 수 있음. array(배열), structure(구조체)

8.1 - 1차원 배열

8.2 - 다차원 배열

8.3 - variable-length arrays (C99)


8.1 One-Dimensional Arrays


array: a data structure containing a number of data values, all of wich have the same type.

these values ,called elements, can be individually selected by their position within the array.

int type의 원소 10개를 가진 배열 a를 선언

int a[10];


배열의 크기를 나중에 바꾸게 될 때를 대비해 배열의 크기를 macro로 선언하는 것도 좋은 방법.

#define N 10

int a[N];


Array Subscripting

배열의 각 원소에 접근하기 위해 배열 이름 뒤에 [i] 를 붙이는 것. susbscripting 또는 indexing이라 부른다.

a가 10개의 원소를 가진 배열이라면, a[0], a[1], ..., a[9]

a[i]는 lvalue이므로, 보통의 변수들과 같이 사용 가능하다.

a[0] = 1;

printf("%d\n", a[5]);

++a[i];



Array Initialization

array를 선언함과 동시에 값을 지정해 주는 것

가장 흔한 형태

int a[5] = {1, 2, 3, 4, 5};


initializer가 array보다 짧으면 남은 자리에 모두 0이 들어간다.

int a[5] = {1, 2, 3};    /* initial value of a is {1, 2, 3, 0, 0} */


쉽게 모든 원소를 0으로 하는 배열을 만들 수 있다.

int a[5] = {0};    /* initial value of a is {0, 0, 0, 0, 0} */


initializer가 있으면 배열의 길이는 생략 가능하다.

int a[] = {1, 2, 3, 4, 5};


designated initializers (C99)

int a[5] = {[0] = 1, [2] = 3, [4] = 5};    /* initial value of a is {1, 0, 3, 0, 5} */

int a[] = {[5] = 3, [19] = 20};    /* length of a is 20 */



Using the sizeof Operator with Arrays

sizeof 연산자는 배열의 크기도 알려준다. 단 원소의 갯수가 아닌 byte 기준으로

a가 10개의 int가 있는 배열이라면, sizeof(a)는 보통 40

배열에 몇 개의 원소가 들어있는지 알기 위해서는 하나의 원소를 저장하는 데 필요한 bytes 로 나누면 된다.

sizeof(a)/sizeof(a[0]);    /* 배열의 길이 */


또는 macro를 이용(나중에 macro에 parameter를 넣으면 유용해진다)

#define SIZE ((int) (sizeof(a) / sizeof(a[0])))

for (i=0; i < SIZE; i++)

a[i] = 0;




8.2 Multidimensional Arrays


이차원 배열을 2차원의 표처럼 visualize하지만, 실제로 메모리에 저장되는 방식은 row-marjor order에 따른다.

가장 처음에 row 0이 저장되고, row 1이 그 다음으로 저장되는 식이다.

m[5][9]이라는 배열이 있을 때, 아래와 같이 저장된다.




Initializing a Multidimensional Array

int m[3][4] = { {0,1,2,3},

{4,5,6,7},

{8,9,0,1} };


initializer가 다차원 배열을 채우기에 충분하지 못한 경우, 나머지 공간의 원소는 0이 된다.

int m[3][4] = { {0,1,2,3},

 {4,5,6,7}};    // 마지막 행은 {0,0,0,0}이 된다.


안쪽 리스트가 한 행을 채우기에 충분하지 못하면, 그 행의 나머지 원소는 0이 된다.

int m[3][4] = { {0,1,2,3},

 {4,5,6},       // 마지막 원소는 0으로 채워짐

 {7,8,9,0}};


내부의 괄호를 생략해도 된다

int m[3][4] = {0,1,2,3,

4,5,6,7,

8,9,0,1};


1차원 배열과 같이 designated initializer 가능(C99)

double ident[2][2] = {[0][0] = 1.0, [1][1] = 1.0};    // 지정하지 않은 자리의 원소는 0이다.


Constant Arrays

array 선언시 const라는 글자를 맨 앞에 써주면 원소들은 constant가 되어 수정할 수 없게 된다.

const char hex_chars[]


8.3 Variable-Length Arrays(C99)


가변 길이 배열, 줄여서 VLA

때로는 배열의 길이를 constant로 지정하지 않고 선언하는것이 가능하다.

int n;

printf("Input length of the array: ");

scanf("%d", &n);

int a[n];

위 코드에서 배열 a의 길이는 프로그램이 컴파일될 때가 아니고 실행될 때 결정된다.

VLA의 제한은 static storage duration을 가질 수 없는 것, initializer를 가질 수 없다는 것이다.

보통 main이 아닌 다른 함수에서 많이 쓰인다.



+ Recent posts