2학년/C

[C]배열(1)

CS_student 2023. 7. 26. 12:48

배열

동일한 변수명으로 인덱스(순서)만 변경함으로써 관리되는 동일한 자료형을 갖는 메모리상 연속된 변수들의 집합

 

int num[4]

 위 명령문을 컴파일러가 읽게 되면, 컴파일러는 메모리상에서 int형의 사이즈(4byte)의 1칸씩 총 4개의 길이를 갖는 배열 num에 대해서 인지한다. ( == 16byte) 일차원 배열에서 배열의 길이는 생략할 수 있으나 반드시 선언과 동시에 초기화해주어야한다. 컴파일러는 이를 기준으로 컴파일 타임에 메모리의 크기를 확정한다.

 

배열 또한 일반적인 지역변수처럼 블록 안에서 선언되었다면 스택메모리에 할당되며 초기화하지 않을 시 쓰레기 값이 저장되어 있다. 

int num[4] = {1,2,3,4};

인덱스는 0부터 시작하여, num[0] = 1 / num[1] = 2 / num[2] = 3 / num[3] = 4 , 3에서 끝난다.

 

배열과 포인터의 관계(1)

 배열은 메모리상에서 연속된 공간에 할당된다. 배열의 이름은 배열이 시작하는 첫 번째 요소가 저장된 수소값이다. 즉, 배열의 이름은 포인터 상수이다. 

  ex) int num[4]일 때, num == &(num[0]) 

배열의 이름을 포인터상수로 지정한 이유는, 배열이 연속된 메모리 할당을 보장하기 때문이다. (배열의 어느 한 요소의 주소값과 자료형만 안다면 모든 요소에 대해 포인터연산을 통해 접근이 가능하다) 

더보기

   num == &num[0]

   *num == *(&num[0]) == num[0]

   num+3 == &num[3]

   ** arr[5] 와 *(arr+5)는 완전이 동일한 식 

 

 2차원 배열 

  2차원 배열은 배열요소로 1차원 배열을 가지는 배열이다. 

더보기

타입 배열이름[열의길이][행의길이];

 

임의의 2차원 배열을 나타내 보자면, 

arr = { 

 { 11,12,13,14},     

 {21,22,23,24},   

 {31,32,33,34},

 {41,42,43,44}

}

처럼 나타낼 수 있다.

arr[0][1] = 12; 

하지만 컴퓨터의 메모리는 입체적인 공간이 아닌 선형 공간이므로, 실제로는 다음 그림과 같이 저장된다.