지금까지 배열을 선언하고 사용할때 당연하게 생각하면서, 아무런 생각없이 하였는데 이번 기사 공부를 통해 아직 개념이 미흡한 부분이 많다는 것을 느끼게 되었다.
말 그대로 1차원 배열이다.
C언어 기준으로 중괄호내 원소를 나열하여 나타내고, 한 배열안에 속한 원소들은 반드시 자료형이 동일해야 한다.
2차원 배열은 n행 m열 형태의 배열처럼, 일반적인 행과 열의 형태로 나뉘어진 배열이다.
중요한 것은 2차원 배열의 특징이다.
2차원 배열은 C언어 기준으로 중괄호에 원소들을 표기해주는 것으로 선언 및 초기화해줄 수 있다.
이때 두가지 선언 방법이 있는데, 첫번째 경우는 배열의 행과 열 크기에 정확히 맞춘 상태로 선언하는 경우이다.
int c[2][3] = {{1,2,3}, {4,5,6}};
printf("%d\n", b[0][0]);
printf("%d\n", b[0][1]);
printf("%d\n", b[0][2]);
printf("%d\n", b[1][0]);
printf("%d\n", b[1][1]);
printf("%d\n", b[1][2]);
위 C언어 코드처럼 하나의 중괄호를 record, 한 행(row)으로 보면 이해가 쉬울 것 같다.
위와 같이 2행 3열의 배열을 선언한 후, 그대로 2행 3열의 배열 형태에 맞춰서 원소를 할당해주는 방법이 있다.
출력결과 >>
1
2
3
4
5
6
두번째 경우는 배열의 행과 열 크기에 정확히 맞추되, 구분을 짓지 않고 하나의 중괄호 형태로만 선언하는 방법이다.
int a[2][3] = {1,2,3,4,5,6};
printf("%d\n", a[0][0]);
printf("%d\n", a[0][1]);
printf("%d\n", a[0][2]);
printf("%d\n", a[1][0]);
printf("%d\n", a[1][1]);
printf("%d\n", a[1][2]);
위와 같이 중괄호 내에서 다시 중괄호를 사용하여 구분짓지 않고서도, 크기만 맞는다면 각 원소들이 순서대로 배열값으로 할당된다.
출력결과 >>
1
2
3
4
5
6
2차원 배열의 선언을 할때 유의해야하는 경우는 배열의 크기에 맞추어 선언하지 않았을때 어떤 값이 할당되는지에 대한 것이다.
기본적으로 변수 및 배열이 선언되었을때, 값을 초기화하지 않는다면 쓰레기값이나 0으로 초기화된다.
보통 배열과 같이 하나의 단위로 묶는 구조에서는 초기화하지 않는 값은 0으로 초기화되는데, 2차원 배열 역시 마찬가지이다.
int b[2][3] = {{1,2,3}};
printf("%d\n", b[0][0]);
printf("%d\n", b[0][1]);
printf("%d\n", b[0][2]);
printf("%d\n", b[1][0]); //0
printf("%d\n", b[1][1]); //0
printf("%d\n", b[1][2]); //0
위에서 크기에 맞게 선언하지 않아도, 초기화하지않은 배열의 공간에는 0이 초기화된다.
출력결과 >>
1
2
3
0
0
0
보통 배열을 포인터와 연관할 경우, p+1, p+2 등 배열의 주소를 순차적으로 건너뛰어 해당 주소에 해당하는 변수값을 어떻게 찾느냐가 중요한 개념이 될 것이다.
이때 "순차적으로 건너뛴다", "한 칸 건너뛴다"의 의미는 "해당 배열의 자료형 크기만큼(char -> 1byte, int -> 4byte) 배열의 주소값을 단계적으로 건너뛴다"라는 의미로 받아들이면 될 것 같다.
위 그림처럼, 2차원 배열이 메모리 주소를 참조한다면 행렬 size 및 자료형의 크기대로 주소값을 옮겨가며 행렬값을 초기화한다.
2차원 배열 관련 - https://studyc.tistory.com/16