。공부 。

[C언어] 배열이름도 포인터?

kyoe 2008. 1. 17. 23:07
배열이란 둘이상의 변수를 동시에 선언하거나 많은 양의 데이터를 일괄적으로 처리할때 주로 쓰인다.
하지만 우린 배열이또다른 의미를 갖고 있다는것을 알면서도 대충알고만 넘어가는 경우가 많다.

배열을 또다른 말로 풀이하면 상수포인터라고 말할수있습니다.
그이유를 알아보자.

int array[5] = {0,1,2,3,4};
다음과 같은 배열이 있고 배열 array의 첫번째 요소의 주소값이 0x1000번지에 할당되었다고 가정하자.
그럼 두번째 요소인 array[1]은 int형 배열이기 때문에 4byte를 건너뛴 0x004번에 할당될것이다. 만 double형이였다면 8byte씩 건너뛰어서 할당이 되겠지요..

아래와같이 배열요소의 결과값을 출력하면 결과값은 당연히 0과 1이 나오겠죠?
printf("array[0] : %d, array[1] : %d \n",array[0],array[1]);

그럼 이번엔 배열 요소의 주소값을 출력해 보죠. 결과값은 위에서 가정한 0x1000과 0x004 가 나올겁니다.
printf("%d 번지, %d 번지\n",&array[0],&array[1]);

마지막으로 배열이름의 주소값을 출력해 보도록하죠 이상하게도 위의 array[0]번째요소의 주소값인
0x000이 출력이 됩니다. 이것으로 우리는 배열의 이름은 배열의 첫번째요소 즉 배열의 0번째 인덱스의 주소값을 갖는것을 알수있습니다.
printf("array배열이름의 주소 : %d \n",a);

포인터로 예로 들자면 포인터 역시 주소값을 가르킬수있고 또한 자료형도 갖고 있습니다.
이렇게 우리는 주소값 + 자료형 을 갖고 있는것을 포인터라 하죠
배열역시 주소값과 자료형을 갖고 있기때문에 우리는 배열역시 포인터라고 정의를 내릴수 있습니다.

하지만 배열과 포인터가 완전히 같지는 않습니다. 포인터는 다른주소 의 값을 가질수 있지만 배열은 처음에 할당된 주소값만을 가르킬수있습니다. 만약 배열의 주소값을 변경할수있다면 백개씩이나 되는 배열을 요소를 갖고있는 배열을 실수로 다른 주소로 변경하게 된다면 난감하겠죠.. 뭐 간단한 예를 든겁니다. 꼭 이래서 그런것이 아니라.
실제로
int oop = 10;
array = &oop;
이렇게 array배열에 변수 opp의 주소값을 넣으면 에러가 발생합니다.

간단히 정리하자면 이렇습니다.
배열의 배열이름은 주소값과 자료형을 갖는 포인터이지만 주소값을 변경할수없는 상수포인터이다.