a라는 변수에는 10이 들어 있다. 하지만 컴퓨터 입장에서는 메모리의 어떤 위치에 10이 저장되어 있는 것이다.
포인터를 이해할 때 값과 주소를 한 줄에 섞어 적으면 금방 헷갈린다. 변수 a에는 값 10이 있고, 포인터 p에는 a가 저장된 위치의 주소가 있다는 식으로 두 종류의 정보를 나누어 생각해야 한다.
&는 변수의 주소를 얻고, *는 그 주소가 가리키는 곳의 값을 다룬다. 시험에서는 기호를 외우는 것보다 ‘지금 이 변수에 들어 있는 것이 값인가, 주소인가’를 계속 구분하는 것이 더 중요하다.
주소를 저장하는 변수
&a는 a가 저장된 메모리 주소를 뜻하고, p는 그 주소를 저장한다.
p가 가리키는 위치에 20을 저장한다. 결국 a의 값도 20으로 바뀐다.
포인터가 어려운 이유
숫자 10을 보는 것과 10이 저장된 주소를 보는 것은 전혀 다르다.
&a → a의 주소
p → a의 주소
*p → 그 주소에 저장된 값
시험에서 포인터 문제가 나오면 머릿속으로만 따라가지 말고 변수와 주소의 연결을 그림으로 적는 것이 안전하다.
포인터는 메모리를 직접 다룰 수 있게 해 주는 만큼 잘못된 주소를 사용하면 프로그램 전체에 큰 영향을 줄 수 있다. 따라서 ‘주소가 유효한가’, ‘가리키는 대상의 수명이 끝나지 않았는가’를 함께 생각해야 한다.
배열 이름과 주소의 관계
배열의 원소는 메모리에 연속적으로 놓인다.
그래서 배열의 시작 위치와 첫 번째 원소의 주소는 밀접하게 연결된다.
이런 표현을 이해하면 배열과 포인터 문제가 하나의 구조로 보이기 시작한다.