[C]배열(1)
배열
동일한 변수명으로 인덱스(순서)만 변경함으로써 관리되는 동일한 자료형을 갖는 메모리상 연속된 변수들의 집합
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;
하지만 컴퓨터의 메모리는 입체적인 공간이 아닌 선형 공간이므로, 실제로는 다음 그림과 같이 저장된다.