다차원 배열
2차원부터 3차원... n차원 배열을 다차원 배열이라고 하는데, 솔직히 쓰임은 3차원을 안 넘어 간다. 다차원 배열의 형식은 int anData[2][3];과 같은 경우가 되는데, 이때 [2]는 행이고 [3]은 열이 되겠다. x, y축으로 된 수직선의 좌표평면과 닮아있다.
이런 이차원 배열을 쓰는 이유는 아파트에 동과 호를 생각하면 편하다. 아파트의 집주소를 찾을 때 큰 의미로 동을 구별하고, 세세하게 호를 구별하게 동과 호를 만든 이유가 있는데, 이것이 다차원 배열의 쓰는 이유와 똑같다.
다차원 배열의 초기화는 int anData[2][3] = { {10,20,30}, {40,50,60} }; 과 같이 초깃값을 넣어줄 수 있다. 여기서 인덱스의 제로인덱스베이스 규칙으로 가로로는 행으로 0행, 1행이 생기고, 세로로는 열로 0열, 1열, 2열이 생긴다. 이 값에서 하나를 지목해서 값을 넣어주려면, 열과 행 값을 인덱스 값으로(변수가 된다)넣어서 int anData[0][2] = 0;과 같이 넣어 줄 수 있다. 이렇게 되면 30의 초깃값이 0으로 정보가 바뀌게 되는 것이다. (참고로 인덱스는 요소 - 1 까지 가능한 것을 잊지 말자, 그 수를 실수로 넘으면 ‘오버플로우‘가 돼서 다른 값이 엉뚱하게 바뀔 수 있다)
주의할 점
int aList[6];이 있을 때, aList[3] = 100;이 되면 왼쪽으로 네 번째 값이 100의 값이 된다. 이때 aList[3]은 *(aList+3)으로 바꿀 수 있다고 지난시간 배웠다. 이때 aList[3]에서 []는 포인터로 *로 바꿔도 된다고 했다. 여기서 char*이 *(char *)가 된다면 *가 서로 만나면 가리키는 것을 가리키는 값이 되니까 서로 없어진다.(똔 똔 돼서)
여기서 다차원 배열은 유심히 봐야될 것은 anData는 주소라고 했지만, anData[0]도 주소고, 거기서 +1을 한 값인 anData[1]도 주소가 된다. 다만 다차원 배열은 []한개만 *포인터로 바꿀 수 있다. 따라서 anData[ ][ ]는 anData(*)[ ]로 바꿀 수 있게 된다. 그래서 여기서 요점은 이 anData(*)[ ]을 간접지정(*)하면 *(anData(*)[ ])에서 *두개만 사라지게 된다. 그래서 다시 돌아오는 값이 배열이 돼서( anData[ ] )결국 주소가 된다. 그래서 아까 anData[0]와 anData[1]도 &(엔퍼센트: 주소연산자)가 붙는 말든 간에 그 자체로 주소가 된다는 것, 영상에서 강조했듯이 잊지 말자.
그래서 int anData[2][3];을하고 여기서 행과 열로 가장 끝에 100을 넣어주려면, anData[1][2] = 100;을 하면 된다. 이걸 풀어주는 것이 중요한데, *(anData+1)의 값에 +2를 하고, 그걸 간접지정 해서 *( *(anData+1) +2) = 100;이 되는 것이다. 솔직히 위와 아래 식이 둘이 뜻이 같은데 쓰기에는 전자가 용이하다. 후자의 식에 *( *(anData+1) +2) = 100;의 식에서 *(anData+1)을 anData[1]와 같이 쓸 수 있고, 그 값이 주소라는 것만 알고 있어도 된다. 여기서 anData[1][2]의 주소를 알고 싶으면 &을 붙여주면 되는데, &anData[1][2]은 &*( *(anData+1) +2)와 같고, 여기서 *와&는 만나서 없어지니 *(anData+1) +2로써, ‘anData[1] +2‘가 그 주소 값이 된다.