C 언어의 특징중의 하나는 배열 이름이 이 배열의 첫번째 원소에 대한 포인터와 같다는 것이다. 즉, 임의 배열 a에 대해서 다음 등식이 성립한다.

    a ≡ &a[0]

배열 선언 결과로, 배열 이름 a는 &a[0]와 동일하게 취급될 수 있다. 따라서 a는 포인터처럼 다루어질 수 있다.

p가 포인터 변수이고, a[0]를 가리킬 때, 포인터 산술을 통해서 (p+k)는 a[k]를 가리킨다는 사실을 알고 있다. 마찬가지로, (a+k)는 a[k}를 가리키게 된다.



다음 코드를 통해서 배열 원소와 포인터의 관계를 다시 생각해보자. 포인터 p가 a[i]를 가리킨다면, *p는 a[i]와 동일하다는 것을 알고 있다. 마찬가지로, a는 a[0]를 가리키기 때문에, *a는 a[0]와 동일하며, (a+k)는 a[k]를 가리키기 때문에, *(a+k)는 a[k]와 동일하다.

다음은 *(a+k)가 a[k]와 동일하다는 사실을 확인한다. k의 값을 달리하면서, *(a+k)의 식을 평가한다.

배열 이름이 첫 번째 배열 원소를 가리킨다는 사실을 이용하여, 프로그램 12-1-b를 다음과 같이 작성할 수 있다.

 

그렇다면, 프로그램 12-1-c도 다음과 같이 작성할 수 있는가?

 

여러분이 위 프로그램을 컴파일하려고 하면 오류가 발생할 것이다. 그 이유는 배열 이름은 포인터 변수가 아니고 포인터 상수이기 때문이다. 따라서 배열 이름에 다른 주소를 저장하는 것은 허용되지 않는다.

*a++는 a에 포함된 주소 값을 1만큼 증가시키려고 할 것이다. 그러나 a는 상수이기 때문에, a에 포함된 주소 값을 변경하려는 시도는 허용되지 않는다.


배열 이름은 포인터 변수에 직접 배정될 수 있다. 따라서 다음의 배정문이 가능하다.

   

int a[5];
int *p;

p = a;

따라서 그림 12-1-c는 다음과 같이 수정할 수 있다.

 

다음 코드4 는, 배열 이름을 통해서 배열 원소를 참조하는 프로그램이다.

 

 

[프로그램 단위 입력 실행] 다음 실습창을 통해서 프로그램 코드 4의 실행과정을 알아본다

(여러분은 실습창의 왼편에 위치한 '새프로그램 입력' 버튼을 클릭하여 새로운 프로그램을 입력하여 실행시켜 볼 수 있다. )

 

 

[문장 단위 입력 실행] 여러분은 다음 실습창에서 C 프로그램을 한 문장씩 입력하여 실행시켜  볼 수 있다. 배열 이름을 통해서 새로운 프로그램을 한 문장씩 입력하고 오른쪽 창에서 그 실행 결과를 살펴 보시오.    (실습 도움말)

 

 


top으로... 다음페이지로... 이전페이지로.. home으로..