배열의 이름은 포인터이다. 단, 그 값을 바꿀 수 없는 '상수 형태의 포인터' 이다.
Ex.1
int *ptr;
int num;
ptr = #
ptr = &num2;
포인터는 가리키는 주소값의 변경이 가능한 변수 형태이다.
Ex.2
int arr[3] = {0, 0, 0};
printf("배열의 이름 : %p \n", arr);
printf("배열의 첫 번째 요소의 주소값 : %p \n", &arr[0]);
다음 코드를 컴파일 해보면 배열의 이름과 배열의 첫 번째 요소의 주소값이 동일하다는 것을 알 수 있다.
이것은 배열의 이름은 배열의 첫 번째 요소의 주소값을 가리키는 상수 형태의 포인터(포인터 상수) 라는 것을 의미한다. 즉 배열의 이름은 배열의 시작 주소값을 의미 !
결국 포인터 변수와 배열 이름은 주소값 변경의 가능 여부(상수이냐?, 번수이냐?)에서의 차이가 있을 뿐, 둘 다 포인터라는 점은 같다. (둘 다 이름이 존재 하며, 메모리의 주소값을 저장함)
배열의 이름도 포인터이기 때문에 배열의이름을 피연산자로 하는 * 연산이 가능하다.
Ex.3
#include <stdio.h>
int main(void)
{
int array1[3] = { 1, 2, 3 };
double array2[3] = { 1.1, 1.2, 1.3 };
printf("1) %d --- %g \n", *array1, *array2);
*array1 += 100;
*array2 += 100;
printf("2) %d --- %g \n", *array1, *array2);
return 0;
}
/* 결과 :
1) 1 --- 1.1
2) 101 --- 101.1
*/