C언어

[C 언어] [배열] 배열 기초

Teodore 2023. 1. 13. 21:29
728x90

C 언어에서 많이 쓰는 자료구조 중 하나가 바로 배열이다. 

모두가 아는 배열에 대한 이야기를 하려는건 아니니 끝까지 잘 읽어보길 추천드린다. 

 

1. 배열

배열이란 같은 자료형의 묶음이라고 보면 된다. 

배열은 연속된 자료 묶음이다

마치 비엔나 소시지 같은 모양이라고 보면 된다. 같은 자료형이 묶여 있기 때문에 시작점을 알면 끝까지 연속적으로 이어져 있는 특징이 있다. 

그런데!! 초보자가 많이 실수하는 부분이 여기에 있다. 사진처럼 배열은 비엔나 소시지 묶음으로만 이해하기 때문에 몇가지 문제가 발생하게 된다. 

1
2
3
4
5
6
7
8
9
10
11
12
 
char arr[10];
 
void print_arr_size(char arr[]){
    printf("array size : %d\n"sizeof(arr));
}
 
int main(void){
    printf("array size : %d\n"sizeof(arr));
    print_arr_size(arr);    
    return 0;
}
cs

이전의 sizeof 연산자 관련글을 읽은 사람은 짐작할 수 있을 것이다. 

위의 결과는 

"array size : 10"

"array size : 4" (64bit 환경에서는 8로 나타날 것이다)

이러한 현상에 대해 제대로 이해하려면 배열이란 존재를 제대로 파악할 필요가 있다. 아래 그림을 보자. 

배열은 소시지를 담고 있는 봉지다

내가 만든 개념이지만 이것보다 완벽히 설명할 방법이 딱히 떠오르진 않는다. 

위 그림을 보면 봉지도 arr이란 이름을 가지고 있고, 첫 비엔나 소시지도 arr이라는 이름을 가지고 있다. 

변수를 직접 사용할땐 직접 접근하는 것이므로 봉지를 뜯어 비엔나 소시지를 직접 확인할 수 있다. 

그러나 함수의 인자로 전달할땐 봉지를 카피해서 전달하는 것이고 그 봉지안은 비엔나 소시지가 있는 곳으로 통하는 웜홀이 있는 것이다. 그러니 함수로 전달받은 봉지는 그 안을 들여다봐도 모두 웜홀만 보이기 때문에 봉지 크기만 잴 수 있는 것이다. 

 

이러한 개념을 C 기초를 배우는 분들은 반드시 익혀야 한다. 

꼭 외워야 하는 것은 배열과 함수는 함수 인자로 전달할 수 없기 때문에 포인터를 통해 전달한다. 

전달된 포인터는 그 원형(배열 함수 원본)을 담을 수 있는 봉지이기 때문에 sizeof 연산자로는 크기를 잴 수 없다. 

 

2. 추가로 

포스팅을 마무리 하기 이전에 추가로 봉지의 개념을 증명하는 코드를 올리고자 한다. 

arr의 주소값인 &arr을 보면 둘다 동일한 주소를 가지고 있는 것을 확인할 수 있다. 

728x90