Page 54 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 54

포인터로 해석할 수 있습니다. 즉, a에 들어 있는 값은 a[0]의 주소인 &a[0]과 같습니다. 배열 a의 자
                   료형이 Type이면 요소 개수와 관계없이 a의 자료형은 Type *형입니다.



                   따라서 포인터 p에 주어진 초기화 값이 a이므로 p에 넣는 것은 &a[0]의 값과 같습니다. 그 결과로 포
                   인터 p는 배열 a의 첫 번째 원소 a[0]을 가리키도록 초기화됩니다.


                   그런데 배열의 요소를 가리키는 포인터는 다음과 같은 규칙이 성립됩니다.


                     포인터 p가 배열의 요소 e를 가리킬 때
                     p + i는 요소 e의 i개만큼 뒤쪽의 요소를 가리키는 포인터가 되고,
                     p - i는 요소 e의 i개만큼 앞쪽의 요소를 가리키는 포인터가 됩니다.



                   예를 들어, 그림에 출력된 대로 p + 2는 a[0]의 2개만큼 뒤쪽에 있는 요소 a[2]를 가리키고, p + 3은
                   a[0]의 3개만큼 뒤쪽에 있는 요소 a[3]을 가리킵니다.



                   이제 배열의 요소를 가리키는 포인터 p + i에 간접 연산자 *를 적용하면 어떻게 될지 생각해 보겠습니
                   다. p + i는 p가 가리키는 요소의 i개만큼 뒤쪽에 있는 요소를 가리키는 포인터이기 때문에 p에 간접 연
                   산자를 적용한 식 *(p + i)는 a[i]에 접근하는 식입니다. 그러므로 p가 a[0]을 가리키면 식 *(p + i)는
                   a[i]와 같습니다.


                   아래 규칙을 반드시 기억해 두어야 합니다.


                     포인터 p가 배열의 요소 e를 가리킬 때
                     요소 e의 i개만큼 뒤쪽의 요소를 나타내는 *(p + i)는 p[i]로 표기할 수 있고,
                     요소 e의 i개만큼 앞쪽의 요소를 나타내는 *(p – i)는 p[-i]로 표기할 수 있습니다.



                   예를 들어, p + 2는 a[2]를 가리키고 있으므로 *(p + 2)는 a[2]입니다( C ). *(p + 2)를 p[2]로 표기할
                   수 있으므로 p[2]는 a[2]와 같습니다( B ). 여기서 배열 이름 a는 첫 번째 요소 a[0]에 대한 포인터입니
                   다. 그 포인터에 2를 더한 a + 2는 세 번째 요소 a[2]에 대한 포인터입니다. 포인터 a + 2가 요소 a[2]
                   를 가리키므로 포인터 a + 2에 간접 연산자 *를 적용한 *(a + 2)는 a[2]와 같습니다( A ).



                   따라서 그림 2C-1  A ,  B ,  C   의 식 *(a + 2), p[2], *(p + 2) 모두가 배열의 요소 a[2]에 접근하는 식
                   임을 알 수 있습니다.







                   54   C 알고리즘
   49   50   51   52   53   54   55   56   57   58   59