포인터배열
일단 알아야 할 첫 번째 잡기술
포인터는 자료형에 상관 없이 4byte를 차지한다. 별로 중요해보이지 않다고 느낄수도 있으나 은근 중요한 내용이다.
int a[5] = { 2, 4, 6, 8, 10 };
int* p = a;
sizeof(int) = 4;
sizeof(a) = 20;
sizeof(a[0]) = 4;
이런 식으로 공간을 차지하고 있다.
만약 a = 50을 선언하면?
--> 에러가 난다. 그 이유는 배열명은 변수가 아니라 시작 주소를 가지는 상수이기 때문이다.
여기서 중요한 점은 배열명은 시작 주소를 가지는 상수라는 부분이다.
a[0]의 주소값을 100번지라고 한다면,
a = 100 번지
a + 1 = 104번지
이런식으로 읽을 수 있다.
마찬가지로 포인터식으로 표현하자면,
a = 100번지이므로
*a = 2라고 읽을 수 있다.
a[1]의 값을 포인터식으로 부르고자할 때는 *(a + 1)로 호출하면 된다.
처음에 p를 선언한 것을 이용해보자
a[0] = 2, a[1] = 4를 가리킨다.
마찬가지로 p[0] = 2, p[1] = 4를 가리킨다.
이것이 가능한 이유는 뭘까?
--> a는 변수가 아니라 시작 주소를 가지는 상수이고, p 역시 a라는 이름의 배열의 시작 주소를 가리킨다. 여기서 컴퓨터는 배열의 개념을 모르기 때문에 이런 표현이 가능하다.
즉, a도 배열의 주소를, p도 배열의 주소를 가리키기 때문에 동일한 값이 출력된다.
여기서 중요한 점은
a = a + 1 과 같은 선언이 불가능하지만,
p = p + 1 과 같은 선언이 가능하다는 점이다.
그 이유는 배열명은 앞서 설명했듯이 상수로, 값 변경이 불가능하나 포인터는 변수이므로 가능한 것이다.
그러므로 p = a + 3와 같은 표현이 가능하다.
또한, 둘의 메모리 크기도 차이난다.
sizeof(a) = 20 이지만, sizeof(p) = 4이다.
그 이유 역시 위와 마찬가지이다.