본문 바로가기

BackEnd/C

1차원 배열의 이해와 활용

반응형

1. 1차원 배열의 이해와 활용


1) 배열의 선언


배열은 둘 이상의 변수를 한번에 선언하는 것으로 총 3가지가 필요하다.


- 배열의 이름


- 배열 요소(배열을 구성하는 변수)의 자료형


- 배열의 길이



이렇게 배열이 선언되면 총 7개의 int형 변수를 얻게 된다.


2) 선언된 배열의 접근


이렇게 얻은 변수들에 접근하는 방법을 살펴보자.


array[0] = 10; //첫 번째 배열 요소에 10저장.


array[1] = 20; //두 번째 배열 요소에 20저장.


즉 다음 그림처럼 배열 요소에 접근할 수 있게 된다.



위 그림에서 보여주듯이 접근하고자 하는 배열의 위치 정보는 [ ] 사이에 숫자를 넣어 지정한다.


단 [ ] 사이에 들어가는 숫자(인덱스)는  0부터 시작된다. 결국 [ ] 안에 변수가 올 수 있는것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(void)
{
    int arr[5];
    int i;
 
    arr[0]=10;
    arr[1]=20;
    arr[2]=30;
    arr[3]=40;
    arr[4]=50;
 
    for(i=0; i<5; i++)
    {
        printf("%d번째 요소에 저장된 값: %d \n", i+1, arr[i]);
    }
 
    return 0;
}
cs


1
2
3
4
5
1번째 요소에 저장된 값: 10
2번째 요소에 저장된 값: 20
3번째 요소에 저장된 값: 30
4번째 요소에 저장된 값: 40
5번째 요소에 저장된 값: 50
cs


 3) 배열을 선언과 동시에 초기화


위 그림은 가장 일반적인 초기화 방식이다. 배열의 길이와 동일한 개수의 초기화 리스트가 존재


하기 때문에 초기화 리스트에 나열된 값은 배열에 순서대로 저장된다.




위 그림은 배열의 길이를 나타내느 값이 빠졌다. 이러한 경우 컴파일러가 초기화 리스트의 길이


를 참조하여 배열의 길이를 결정한다.



위에서 초기화 리스트의 길이가 배열의 길이보다 작으면, 나머지 부분은 0으로 초기화 한다.



2. 배열이 필요한 2가지 이유


1) 다수의 변수 선언 필요성


배열은 많은 수의 변수 선언에 편의를 제공한다.




2) 반복문 활용(둘 이상의 변수에 동일한 코드 적용 가능)


배열로 선언된 변수들에는 동일한 코드 패턴을 적용할 수 있다.





3. 배열 접근 과정에서의 주소 계산


배열 요소의 접근 과정을 메모리 관점에서 봐보자.


아래 그림은 arr 배열의 이름이 의미하는 바를 설명한다.



배열 arr은 0x10번지를 시작으로 할당되었다. 그리고 배열의 arr 이름이 지니고 있는 값


이 배열이 할당된 위치의 시작 주소인 0x10번지를 의미하게 된다. 


이제 배열 요소의 접근 원리를 봐보자. 다음과 같은 형태로 배열 요소에 접근 한다.


arr[0] = 10;

arr[1] = 20;

arr[2] = 30;

arr[3] = 40;


배열의 이름과, 인덱스 정보를 이용해서 배열 요소의 주소값을 계산해낸다.


아래는 선언한 배열 요소의 접근에 필요한 주소 값의 계산 과정을 보여준다.



위 그림을 보면 


- 배열의 이름이 시작 주소를 알려준다.


- 인덱스 정보는 시작 주소를 기준으로 몇 바이트를 이동해야 하는지 알려준다.


위 그림에서는 인덱스 값에 각각 4를 곱한다. 4는 배열의 자료형에서 나온것이다.


int 형 배열이니, 배열 요소당 간격은 4바이트씩이다. double인 경우 8바이트이다.



4. 가변 길이 배열의 선언


변수를 이용해서 선언하는 배열을 가리켜 가변 길이 배열(variable length array)이라 한다.


입력이나, 연산의 결과에 따라서 배열의 길이를 다양하게 선언할 수 있다. 


모든 컴파일러가 가변 길이 배열을 지원하는것은 아니다.






반응형

'BackEnd > C' 카테고리의 다른 글

2차원 배열의 이해와 적용  (0) 2019.03.10
배열을 이용한 문자열의 표현  (0) 2019.03.10
비트 마스크  (0) 2019.03.09
비트 쉬프트(Shift) 연산자  (0) 2019.03.09
비트연산자  (0) 2019.03.08