- 배열의 이름은 포인터이다. (그 배열의 0 번째 요소 = base 의 주소값을 저장하는)
- 구조체의 주소를 저장하고 싶을 때는, 구조체 포인터를 사용한다.
- 그리고 구조체 포인터와 화살표 → 를 이용하여 구조체 안의 요소에 접근할 수 있다.

- 이중 포인터란, 다른 포인터의 주소를 저장하는 포인터이다.
- 포인터 자체에 1을 더하거나 빼면, 그 바로 다음의 주소나 그 바로 전의 주소를 가리킨다.

- *p++ 과 (*p)++ 은 결과가 서로 다르다.

우선 *p++ 의 경우에는 p 에 더하기 1을 한 다음 * 로 접근하라는 것이므로, 주소값을 증가시키는 것이고, (*p)++ 의 경우, p 가 가리키는 값에 1을 더하라는 의미이므로!! + 여기서 후위 연산자는 return 한 다음에 값을 증가시키는 것임을 주의 하자!
- 타입 변환 시에, 포인터 표시하는 것을 잊으면 안된다!

- 동적 메모리 할당 → 정적 메모리 할당의 경우, 메모리에 차지하는 공간이 일정하게 고정되어 있을 경우 유용하지만, input 데이터의 변화에 따라 메모리가 바뀌는 경우 비효율적이다. 따라서 나온 것이 input 데이터에 따라 메모리 용량을 알맞게 할당하는 동적 메모리 할당이다.

- 타입에 따라 위와 같이 선언을 한다. 참고로 메모리 동적 할당은 배열에서만 가능한 이야기이다. 왜냐면, 같은 타입이어야 하니까. + 배열에서 동적 할당이 필요한 이유, arr[length] 처럼 배열의 크기에 변수를 넣을 수 없고 상수만 올 수 있기 때문에..! 참고로 이차원 배열의 경우 더블 포인터로 구현이 가능하다. 메모리 할당과 배열 사용이 모두 종료된 뒤에는 free 명령어를 사용해서 메모리 공간을 효율적으로 사용할 수 있게끕 하자!
- 참고로 배열의 길이는 sizeof(arr) / sizeof(arr[0]) 으로 구할 수 있다.
- p → number 는 p[0].number 와 같은 말이다. (p+1) → number 는 p[1].number 와 같다.
- 2차원 배열 동적 할당으로 만들기
