int a = 15;
&a // &a 는 변수 a 의 메모리상 주소값
int* p = &a; // p는 포인터 변수 ( 변수 a 의 메모리상 주소 값 )
p // p는 메모리상 주소값 반환
*p // *p는 p주소에 있는 실제 값(15)
int arr[5] = {1, 2, 3, 4, 5}; // 배열선언
arr // 배열의 첫 값의 주소값
arr + i // (i+1) 번째 요소의 주소 값
*(arr + i) == arr[i] // 실제값
arr+i == &arr[i] // 주소값
(*p)++; // ()안에 주소값에 있는 실제값이 ++
*p++; // 주소값 자체가 ++ ( 증감 연산이 참조 연산보다 먼저 )
int* arrPtr = arr; // 포인터 변수 arrPtr 에 arr 배열의 첫번쨰 요소의 주소값
arrPtr++; // 첫 요소의 주소값에 특정 바이트가 + 되어 다음 요소의 주소값이 됨 ( 배열의 자료형에 따라 + 되는 바이트 값이 달라짐 (int 배열에서는 4만큼 + ))
arrPtr++ == &arr[1]
const int* p // 포인터를 이용해 실제값을 변경할 수 없게
int* const p // 포인터가 가리키는 주소값을 변경할 수 없게