자바에서의 배열과 C에서의 배열은 성격이 좀 다르다.
일단, 배열을 선언한 변수 이름은 배열의 시작 주소를 의미하는 포인터이다. ( arr = &arr[0] )
자바에서는 arr을 객체로 저장해 arr자체로는 뭐 할 수 있는게 많이 없지만, C에서는 그 자체로도 의미하는 바가 있다.
그러면, 변수명이 배열의 시작 주소를 의미한다고 했으니.. 특정 주소를 할당할 수도 있지 않을까? 라고 생각할 수도 있지만, 할당은 불가능하다.
포인터변수와 배열의 변수명은 굉장히 유사하지만, 배열의 변수명에다가 값을 새롭게 할당할 수는 없다. (읽기는 가능)
int main()
{
int arr[3] = {0, 1, 2};
arr[0]++;
printf("%d \n", *arr); // 1
printf("%d \n", arr[0]); // 1
}
*연산을 통해 값을 가져올 수 있다. *arr과 arr[0]은 같은 값을 나타낸다.
값의 할당 말고는 포인터변수와 동일하다고 이해하자. (선언되고 메모리가 확보된 다음에는 절대로 값이 변하지 않는다)
즉, 배열 이름은 상수임.
배열 이름을 포인터로 쓸 수 있으니, 포인터 변수를 배열로 사용할 수 있지 않을까?
맞다. 위와 같이 포인터 변수에 배열의 위치를 선언해 주면, 포인터 변수를 배열로 사용할 수 있다.
배열 말고 정수 변수를 &연산해서 포인터 변수에 넣어준다고 해도 ptr[0]처럼 접근할 수는 있지만, 의도한 결과를 얻기는 힘들다. (그 위치에 어떤 값이 있는지 모른다!)