C - 배열 (Array)

lsjoon·2024년 2월 3일

C

목록 보기
5/8

배열

배열이란 특정 개수의 같은 형(Type)을 띄는 자료값(Value)을 갖는 자료구조

배열의 선언

배열을 선언하기 위해선 우선 배열의 원소들의 형(type)과 배열의 크기(number)를 결정해야 한다.

int a[10];

/* 좋은 습관 : 배열의 크기를 수정할 예정이라면, 매크로 정의를 사용하면 좋다*/
#define N (10)
...
int a[n];

배열 첨자

배열의 한 특정 원소에 접근하고 싶다면 해당 배열의 이름 다음에 대괄호로 감싼 정수값을 적어주면 됨 ( 배열의 첨자[subscript] 혹은 색인[index] )

- 배열이 T형 의 원소를 갖는다면, 배열의 각 원소들은 마치 실제 T형 변수처럼 다뤄진다.

  • C에서는 첨자의 범위를 확인하는 기능을 강제하지 않으므로, 첨자가 범위를 벗어나게 되면 프로그램의 행동은 불능이 됨.

배열 초기화

int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int a[10] = {1, 2, 3, 4, 5, 6};
// a = {1, 2, 3, 4, 5, 6, 0, 0, 0, 0};

int a[10] = {0};
/* 의도적임을 드러내기 위해 아래와 같이 사용 */
int a[10] = {0, };
// a = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  • [C99] 지정 초기자

  1. 지정자는 반드시 정수상수식이어야 한다.
  2. 초기화하려는 배열의 길이가 n 이라면, 각 지정자는 반드시 0n-1 사이의 값을 가져야 한다.
  3. 배열의 길이가 생략된다면, 지정자는 음수가 아닌 아무런 정수가 될 수 있다.
    이 때, 컴파일러는 가장 큰 지정자의 값을 바탕으로 배열의 길이를 추론한다.

예시

- 배열에서 특정값으로 초기화한 원소 외에 나머지는 0으로 초기화하는 경우

// 아래 코드들의 결과값은 같다
int a[15] = {0, 0, 29, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 48};

/* 2번 예시 */ 
int a[15] = { [2] = 29, [9] = 7, [14] = 48 };

/* 3번 예시 */
int b[] = {[14] = 48, [9] = 7, [2] = 29};

- 원소별 초기자와 지정 초기자를 섞어서 사용하는 방법

배열에서 첫 3개의 원소는 5 , 1 , 9 의 값을 가짐.
4번 원소는 3을 가짐 4번 원소 이후

int c[10] = {5, 1, 9, [4] = 3, 7, 2, [8] = 6};
// c = {5, 1, 9, 0, 3, 7, 2, 0, 6, 0};

배열의 할당

배열 간의 할당은 불가능

- 하나의 배열을 다른 배열로 복사하기 위한 방법
  1. 반복문을 통해 원소 하나 하나를 일일이 복사하는 것
  2. <string.h> 헤더의 memcpy (메모리 복사) 함수를 사용

/* 배열 간 할당은 불가능 */
a = b;

/* 1 */
for (i = 0; i < N; ++i;) {
	a[i] = b[i];

/* 2 */
memcpy(a, b, sizeof(a));
profile
중요한 것은 꺾여도 그냥 하는 마음

0개의 댓글