본문 바로가기
휴지통/C 프로그래밍

1차원 배열

by 신재권 2021. 1. 21.

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

단순하게 배열은 '둘 이상의 변수를 모아 놓은 것'으로 정의 , 하지만 선언방법부터 접근 방법까지 일반적인 변수들과 차이가 있다.

-배열이란 무엇인가?

다수의 데이터를 저장하고 처리하는 경우에 유용하게 사용할 수 있는 것이 배열이다. 한번에 많은 수의 변수를 선언할 수 있기 때문이다. 

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

배열은 일반적인 변수와 달리 여러 개의 값을 저장할 수 있다. 여러 개의 변수가 모여 배열을 이루기 때문이다.

int ondDimArr [4] ;

int : 배열을 이루는 요소(변수)의 자료형

oneDimArr : 배열의 이름

[4] : 배열의 길이

즉 위 선언문이 의미하는 바는 "int형 변수 4개로 이뤄진 배열을 선언하되, 그 배열의 이름은 oneDimArr로 해라"

-길이가 4인 int형 1차원 배열

int

int

int

int

중요한 사실은 int형 변수 네 개가 '나란히' 선언되어 있다는 점이다. 실제로 배열을 이루는 요소들(변수들)의 주소값을 확인해 보면 이러한 사실을 확인할 수 있다.



-선언된 1차원 배열의 접근

int arr[4]; //길이가 3인 int형 1차원 배열

arr[0]= 12; //배열 arr의 첫 번째 요소에 10을 저장해라

arr[1]= 10; //배열 arr의 두 번째 요소에 12를 저장해라

arr[idx] = 20; //배열 arr의 idx+1번째 요소에 20을 저장해라

[]연산자 사이에 배열의 위치정보를 명시하는데 (이 위치에 들어가는 숫자를 가리켜 '인덱스'또는 '인덱스 값'이라 한다) 여기서 중요한 사실은 첫 번째 요소를 지정할 때 사용되는 숫자가 1이 아닌 0이라는 점이다. 즉 배열의 위치 정보를 명시하는 인덱스 값은 1이 아닌 0부터 시작한다. 

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

다수의 변수를 선언해서는 반복문 기반의 순차적인 접근이 불가하다. 때문에 '반복문 기반의 순차적 접근'은 배열의 또 다른 매력으로 작용한다.



-배열 선언과 동시 초기화 하기

기본 자료형 변수들은 선언과 동시에 초기화가 가능하다. 또한 배열도 선언과 동시에 원하는 값으로 초기화를 할 수 있다. 초기화의 방법은 총 세가지로 구분 가능하다.

int arr[5] = {1, 2, 3, 4, 5} //순차적으로 1, 2,3 ,4,5로 초기화

배열의 초기화를 목적으로 선언된, 중괄호로 묶인 부분을 가리켜 '초기화 리스트'라고 한다. 

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

위의 문장에서 보이듯이 초기화를 목적으로 '초기화 리스트'가 선언되면, 배열의 길이 정보를 생략할 수 있다. 

마지막으로 세 번째 초기화 방법은 배열의 길이를 다 채울만큼 초기 값이 선언되지 않은 경우이다.

int arr[5] = {1, 2, } //나머지 요소는 0으로 채워짐



배열의 길이 구하기 

sizeof를 사용한다 . 

ex ) int arr[5] = { . . .};

sizeof(arr) / sizeof(int) 

int형 크기는 4byte이다 . int형 배열을 선언했기 때문에 4byte씩 총 5개의 원소가 있다. 

하지만 길이를 구하기 위해 int(4byte)로 다시 나누어 배열의 길이를 구할 수 있다.

20(byte) / 4(byte) = 5(arr의 길이)

배열의 이름을 대상으로 하는 sizeof 연산의 결과로는 '바이트 단위 배열 크기'가 반환된다.



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

문자열과 배열은 무슨상관이 있을까? 

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



-char형 배열의 문자열 저장과 '널 (NULL)' 문자

C언어 에서는 큰 따옴표를 이용해 문자열을 표현한다. 

char str[14] = "Good Morning!" ; 

위의 선언을 통해 메모리 공간에는 char형 배열이 할당되고, 이 배열에는 다음의 형태로 문자열이 저장된다.


G

o

o

d

 

M

o

r

n

i

n

g

!

\n

 

 




물론 배열의 길이를 생략하는 것도 가능하며, 이 경우 컴파일러가 문자열의 길이를 계산해서 배열의길이를 14로 결정한다.

char str[ ] = "Good morning!";

그런데 문자열을 구성하는 문자의 수는 중간에 삽입된 공백문자를 포함하며 분명 13이다. 위 그림에서 보이 듯이 문자열의 끝에는 '\0'이라는 특수문자(escape sequence)가 자동으로 삽입이 되어 실제 문자열의 길이는 14가 된다. 따라서 문자열의 저장을 목적으로 char형 배열을 선언할 경우에는 특수문자 \0이 저장될 공간까지 고려해서 배열의 길이를 결정해야 한다.

이렇게 문자열의 끝에 자동으로 삽입되는 문자 '\0'을 가리켜 널(null)문자라 하는데, 널 문자가 자동으로 삽입된다.

널 문자의 아스키 코드값은 0이다. 널문자와 공백문자를 혼동할 수 있는데 공백문자의 아스키 코드는 32이다. 둘은 엄연히 다른 것이다.



-scanf함수를 이용한 문자열의 입력

printf함수를 이용해 문자열을 출력할 때 %s를 사용하듯이 scanf함수를 이용해서 문자열을 입력 받을 때도 서식문자 %s를 사용한다.

char str[13];

scanf("%s", str); //str앞에 &연산자를 삽입하지 않는다.

위의 문장의 서식문자 %s는 문자열의 입력을 뜻한다. 그리고 str은 문자열이 저장될 배열을 명시한 것이다. 

문자열을 입력 받는 배열의 이름 앞에는 &연산자를 붙이면 안된다.

"scanf 함수 호출문 구성 시 , 데이터를 저장할 변수의 이름 앞에는 &연산자를 붙여줘야 한다. 그러나 문자열을 입력 받는 배열의 이름 앞에는 &연사자를 붙이지 않는다.

이유는 포인터 부분에서 알게된다.



scanf함수 호출을 통해서 입력 받은 문자열의 끝에도 널 문자가 삽입된다.

C언어에서 표현하는 모든 문자열의 끝에는 널 문자가 자동으로 삽입된다.



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

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

어떻게 선언하든 널 문자가 마지막에 존재하면 C언어의 관점에서 문자열이 되는 것이다.



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

%s는 '인덱스 0이 시작위치이고 문자열의 끝에는 널 문자가 있다' 의 기준으로 문자열을 구분한다.


'휴지통 > C 프로그래밍' 카테고리의 다른 글

포인터의 포인터  (0) 2021.01.21
다차원 배열  (0) 2021.01.21
포인터와 함수에 대한 이해  (0) 2021.01.21
포인터와 배열  (0) 2021.01.21
포인터의 이해  (0) 2021.01.21