배열이란 동일한 DataType을 담는 변수들의 집합이다.
개발자가 프로그램내에서 변수를 선언하게 되면,
운영체제는 변수의 크기에 맞춰 메모리상의 빈 공간을 찾아 메모리를 할당한다.
변수들에게 할당된 공간은 운영체제가 임의로 찾은 공간이기에,
프로그램내에 선언된 변수들은 메모리상에 그 위치가 붙어있을 수도 있고, 혹은 떨어져 있을 수도 있다.
그렇기 때문에 값을 넣거나 변경하기 위해서는 변수들을 일일이 처리할 수 밖에 없다.
<예시>
그러나 배열을 사용하게 되면, 굳이 일일이 처리할 필요가 없다.
개발자가 배열을 선언하게 되는 순간, 개발자가 설정한 배열의 크기만큼 메모리 공간에 잡히게 되는데,
이는 위의 방식처럼 변수의 할당위치가 재각각이 아닌, 연속적으로 이어져 있다.
개발자는 p배열의 첫주소값을 이용하여, p배열이 가진 모든 요소들을 접근할 수 있기 때문에,
반복문을 이용하여 일괄처리가 가능해 지는 것이다.
<예시>
[ 배열 ]
기본형식 : DataType 배열명 [갯수];
배열 선언시에는 첨자사이의 숫자가 개발자가 만들고자 하는 배열의 갯수를 나타내지만,
선언 후에는 배열명은 배열의 시작주소를 나타내며, 첨자 사이의 숫자는 배열의 시작주소로부터 상대적인 거리를 나타낸다.
<예시>
p[0]는 배열의 시작주소로부터 한칸도 떨어져 있지 않다는 것을 의미한다.
p[1]은 배열의 시작주소로부터 한 요소의 크기만큼 떨어져있다는 것을 의미하는데,
p배열은 int형 배열이기 때문에 시작주소로부터 4byte 떨어져 있다는 것을 알 수 있다.
일차원 배열에다가 +1을 하면, 한요소의 크기 만큼 떨어져 있다는 것을 의미하나,
2차원배열에 +1을 하게 되면, 한 행의 크기만큼 떨어져 있다는 것을 의미한다.
마지막으로, 3차원배열에 +1을 하게 되면, 한 면의 크기만큼 떨어져 있다는 것을 말한다.
[주소값과 값의 구분]
주소값과 값의 구분 기준은 첨자([ ])와 별표(*)이다.
위에서는 나타내지 않았지만, 배열의 첨자는 별표로, 별표를 첨자로도 바꾸어 나타낼 수 있다.
그렇기 때문에, 배열의 선언할 때의 첨자의 갯수혹은 별표의 갯수보다 더 적다면 주소값이고, 갯수가 동일하다면 값이다.
+배열의 첨자의 갯수혹은 별표의 갯수가 동일하더라도, 앞에 &가 붙어있다면 값이 아닌 주소값을 의미한다.
<예시>
int a[2][2][2];
#주소값
&a[0][0][0] &a[0][0][1] &a[0][1][0] &a[0][1][1] &a[1][0][0] &a[1][0][1] &a[1][1][0] &a[1][1][1]
a[0][0] a[0][0]+1 a[0][1] a[0][1]+1 a[1][0] a[1][0]+1 a[1][1] a[1][1]+1
*a[0] *a[0]+1 *(a[0]+1) *(a[0]+1)+1 *a[1] *a[1]+1 *(a[1]+1) *(a[1]+1)+1
**a **a+1 *(*a+1) *(*a+1)+1 **(a+1) **(a+1)+1 *(*(a+1)+1) *(*(a+1)+1)+1
a[0] a[0]+1 a[1] a[1]+1
*a *a+1 *(a+1) *(a+1)+1
a a+1
#값
a[0][0][0] a[0][0][1] a[0][1][0] a[0][1][1] a[1][0][0] a[1][0][1] a[1][1][0] a[1][1][1]
*a[0][0] *(a[0][0]+1) *a[0][1] *(a[0][1]+1) *a[1][0] *(a[1][0]+1) *a[1][1] *(a[1][1]+1)
**a[0] *(*a[0]+1) **(a[0]+1) *(*(a[0]+1)+1) **a[1] *(*a[1]+1) **(a[1]+1) *(*(a[1]+1)+1)
***a *(**a+1) **(*a+1) *(*(*a+1)+1) ***(a+1) *(**(a+1)+1) **(*(a+1)+1) *(*(*(a+1)+1)+1)