복습과 유의할 점
들어가기 전에 중요한 것이 있다. 지난시간에 배웠듯이 int anData == [2][3] = { ....... };로 다차원 배열을 했을 경우, 지난시간 anData[0]이나, anData[1]이나 주소 자체로 쓰인다고 했었다. (&가 붙지 않아도) 그래서 알 수 있는 점은 anData는 == anData[0]고, == &anData[0][0] 와 같다고 알 수 있겠다.
그리고 int *pnData;를 선언했으면, int 포인터를 선언했으니, pnData +1을 하면 int 한 개가 +된다. char *pszData라면, pszData + 1은 char값 1개가 더해지는 것이다.
다차원 배열의 포인터 변수
int anData [2][3] = {.....}; 와 같이 있으면, 이것을 포인터로 어떻게 표현할까? 우선 2행 3열로 된 이차원 배열은 3열이 2개(2행)있다고 볼 수 있다. 여기서 개수의 개념을 빼주면 포인터가 되는 것을 이용한다. 그러면 (int [3])* 와 같이 써줄 수 있는데, 이는 성립하지 않는다. 문법에 맞게 고치려면, 주소(포인터)*를 int [3] 사이에 쏙 넣어주면 되는데, 이것이 ‘int 주소 [3]‘과 같이 바뀌고, 이걸 최종적으로 바꾸면 ’int (*포인터 변수 이름) [3]’이 된다. 이것이 열의 길이가 3이고, 요소가 int정수형인 이차원 배열의 포인터 변수다. 절대로 int **와 같이 하지말자.
그럼 다시 anData로 넘어가자. int anData == [2][3] = {....... }; 일 때 anData 자체로 있을 때는 anData는 [2][3]로 2행 3열 있는 것이 한 세트이다. 그래서 &anData+1일 때 +1은 int가 6개가 된다.(물론 여기서 &가 붙을 경우다. &가 있느냐 없느냐에 차이가 벌어진다.) 그리고 &anData[0]+1일 때 anData[0]은 int 3개가 있는 것으로, +1은 int가 3개가 된다. 그러면 당연한 듯이 &anData[0][0]+1일 때는 +1은 int 1개가 되는 것이다. 문법적으로 이정도만 알아도 충분하다만,
헷갈릴 수 있는 내용
(참고 :이 이후부터 내용은 굳이 알면 헷갈릴 수 있는 내용으로 원하면 영상을 여기서 멈추기를 영상에서 권장한다.) printf함수로 aszData와 aszData +1을 각각 출력하면 두 주소의 차이가 16이 나온다. 왜일까? char aszData[3][16] + {......}; 와 같이 앞에서 선언 해줬었다. 그래서 &aszData와 &aszData +1을 각각 출력해서 두 주소의 차이로 나오는 48은 열과 행의 곱인 16*3이 되었기 때문인 것은 위에서 배웠다. char 48이 되기 때문이다. 다시 돌아가면 aszData +1은 aszData[0] + 1와 경우가 일치 하는데, 이때 aszData[0]으로 행을 생략하기에 열인 16을 +1로 해서 1을 더한 값이 char 16이 된다. (위 코드는 &을 생략한 경우로, 될 수 있으면 &을 붙여 쓰고 &가 없으면 이렇게 결과가 달라지는 것 알아두자.)