책 정리/윤성우의 열혈 C

Part02 1차원 배열. Chapter 11

190730 2019. 9. 3. 15:15

배열의 이해와 배열의 선언 및 초기화 방법

 

단순하게 배열은 '둘 이상의 변수를 모아 놓은 것'으로 설명할 수 있다.

다수의 데이터를 저장하고 처리하는 경우에 유용하게 사용할 수 있는 것이 배열이다.

 

1차원 배열의 선언에 필요한 것 세 가지: 배열이름, 자료형, 길이정보

배열은 여러개의 값을 저장할 수 있다. 여러개의 변수가 모여서 배열을 이루기 때문이다.

 

int oneDimArr [4];

 

새로운 C의 표준에서는 다임과 같은 형식의 배열선언을 허용하고 있다.

int main(void)

{

     int len = 20;

     int arr[len];               //변수 len을 이용한 배열의 길이 선언이 가능하다.

     . . . .

}

과거의 C표준에서는 배열의 길이정보를 바느시 상수로 지정하도록 제한하였다. 그런데 이러한 제약사항을 여전히 고수하고 있는 컴파일러도 다수 존재한다. 그러므로 범용적인 컴파일을 위해서는 가급적 배열의 길이정보를 상수로 지정해야 한다.

 

인덱스, 인덱스 값 : 위치정보를 명시하게 되는데 이 위치에 들어가는 숫자를 가르킴.

 

배열의 위치 정보를 명시하는 인덱스 값은 1이 아닌 0에서부터 시작한다.

배열의 모든 요소는 반복문을 이용해ㅓ 순차적으로 접근하는 것이 가능하다.

 

배열의 초기화 방식

1. int arr[5]={1, 2, 3, 4, 5}; // 순차적으로 1, 2, 3, 4, 5로 초기화 함    중괄호로 묶인 부분을 '초기화 리스트' 라 한다.

2. int arr2[]={1, 2, 3, 4, 5, 6, 7};  // 컴파일러에 의해서 자동으로 7이 삽입됨.

3. int arr3[5]={1, 2};  // 3, 4, 5번째 배열요소는 0으로 채워짐

 

sizeof(arr) 는 배열의 이름을 대상으로 하는 sizeof 연산의 결과로는 '바이트 단위의 배열크기' (배열의 길이가 아니다.)가 반환된다. 따라서 배열의 크기가 아닌 길이가 알고싶다면 자료형의 크기만큼 나눠주는 문장을 추가로 구성해야 한다.

 

문자를 1차원 배열에 저장하려면 :

arr[] = {'G','o','o','d',' ','t','i','m','e'};

출력은 printf문 을 출력할 경우 서식문자를 %c 사용하면 된다.

 

배열은 단순히 다수의 변수선언을 대신하지 않는다. 다수의 변수로는 할수없는 일을 배열을 선언하면 할 수 있다.

배열을 선언하면 배열을 구성하는 변수에 순차적 접근이 가능해진다. 이것이 배열의 장점이다.

 

 

배열을 이용한 문자열 변수의 표현

char형 배열을 이용하면 문자열의 저장뿐만 아니라 문자열의 변경도 가능해진다. 즉, 변수형태의 문자열 선언이 가능해진다. 때문에 char형 배열과 문자열에는 큰 상관이 있다.

 

선언방법 char str[14] = "Good morning!";

 

문자열의 저장을 목적으로 char형 배열을 선언할 경우에는 문자열의 끝에는 '\0'(escape sequence)이라는 특수문자가 자동으로 삽입이 되므로 char형으로 문자열을 선언 시 실제 문자열의 길이의 +1을 해줘야 하는것을 유의하자. 그래서 위의 문자열은 13개이지만 14개로 선언을 한 것 이다.

 

Good morning!\0  형태로 저장이 된다.

 

이렇듯 끝에 저장되는 '\0' 을 가리켜 '널(NULL)' 문자라 한다. 널 문자는 아스키코드로 0 공백은 32 이다.

 

널 문자의 아스키 코드 값은 0이므로 다음 두 뭉장은 동일한 문장이다.

str[8] = '\0';

str[8] = 0;

 

scanf("%s", str);     //이 처럼  문자열을 입력받는 배열 앞에는 주소연산자(&)을 붙이지 않는다!!!

 

C언어에서 표현하는 모든 문자열의 끝에는 널 문자가 자동으로 삽입된다.  배열에 저장되는 문자열도 당연히 널 문자가 삽입된다.

 

C언어에선 마지막에 널 문자가 존재하면 문자열이고 존재하지 않으면 문자열이 아니다.

 

때문에   char arr1[ ] = {'H', 'i', '~'};     //마지막에 널 문자가 없으므로 문자 배열

이와 같은 배열의 선언은 문자열이라고 할 수 없다.

            char arr1[ ] = {'H', 'i', '~', '\0'};  //마지막에 널 문자가 있으므로 문자열

 

문자열의 끝에 '널(null)' 문자가 필요한 이유.

널문자가 없으면 문자열의 끝을 구분하기가 어렵다. 메모리상에서 문자열은 이진 데이터로 저장되기 때문에 문자열의 시작과 끝이 표시되어 있지 않다. 즉,

문자열의 시작은 str[0]

문자열의 끝은    str[i] = '\0'

인 것이다.

서식문자 '%s'도 이에 기반하여 문자열을 출력한다.

 

scanf 함수는 공백을 기준으로 데이터를 구분 짓기 때문에 공백이 포함된 문장을 입력 받기에는 적절하지 않다.

 

1차원은 선, 2차원은 면, 3차원은 입체 라고 한다.

지금까지 본 1차원 배열은 일렬로 나열되는 배열이기 때문에 선에 해당한다. 따라서 1차원 배열이라고 한 것이다.