배열의 이름은 포인터입니다. 단 그값을 바꿀 수 없는 '상수 형태의 포인터'입니다.
들어가기 전에,서식문자 %p 는 주소값의 출력에 사용되는 서식문자입니다.
포인터와 배열의 관계
배열 원소에 접근할때 내부에서 포인터를 사용합니다.
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main (void){ int arr[3] = {0,1,2}; printf("%p \n",arr); printf("%p \n",&arr[0]); printf("%p \n",&arr[1]); printf("%p \n",&arr[2]); return 0; } |
출력결과는 다음과 같습니다.
1 2 3 4 | 000000000062FE40 000000000062FE40 000000000062FE44 000000000062FE48 |
(해당 결과는 PC마다 다름. 참고용임)
int는 4바이트라서 int형 배열요소간 주소 값의 차는 4바이트입니다.
위에 사진은 할당된 배열의 구조입니다.
배열의 첫 번째 바이트의 주소 값이 0x63FE40인데,배열의이름을 출력한 결과도 이와 같습니다.
배열의 이름은 대입연산자의 피연산자가 될 수 없으므로 (값의 저장 불가능) 다음의 결론을 내립니다. (arr = arr[0])
배열의 이름은 배열의 시작 주소값을 의미하며, 그 형태는 값의 저장이 불가능한 상수인겁니다.
포인터변수와 배열의이름을 비교
비교조건/비교대상 |
포인터 변수 |
배열의 이름 |
이름이 존재하는가? |
존재한다 |
존재한다 |
무엇을 나타내거나 저장하는가? |
메모리의 주소값 |
메모리의 주소값 |
지시하는 주소값의 변경이 가능한가? |
가능하다 |
불가능하다. |
즉 배열의 이름은 상수형태의 포인터
배열의이름을 포인터 상수 라고 부르기도 합니다.
포인터변수는 가리키는변수를 변경이 가능하지만,배열의이름 (포인터상수)는 가리키는것이 arr[0]으로 고정입니다.
즉 포인터 변수와 배열의이름의 차이점은 변수,상수라는것입니다.
댓글