포인터 심화와 함수 포인터
포인터 연산, 이중 포인터, 그리고 콜백과 상태 머신에 쓰는 함수 포인터를 정리했습니다.
포인터 연산
p + 1은 주소에 1을 더하는 것이 아니라 가리키는 자료형 크기만큼 이동합니다. uint32_t *p라면 4바이트를 건너뜁니다. 배열 이름이 첫 요소의 주소처럼 동작하기 때문에 buf[i]와 *(buf + i)는 같습니다.
이중 포인터
포인터의 주소를 담는 포인터입니다. 함수 안에서 포인터 자체를 바꾸고 싶을 때(예: 버퍼를 할당해 돌려줄 때) 씁니다.
함수 포인터
함수도 주소를 가집니다. 그 주소를 변수에 담아 두면 실행할 함수를 나중에 고를 수 있습니다.
typedef void (*handler_t)(uint8_t);
handler_t on_rx = parse_command;
on_rx(byte); // parse_command(byte) 실행
펌웨어에서 쓰는 곳은 이렇습니다.
- 콜백: 드라이버가 "수신 완료" 같은 일을 위쪽 코드에 알릴 때
- 상태 머신: 상태마다 처리 함수를 표에 넣어 두고 현재 상태의 함수를 호출
- 벡터 테이블: 인터럽트 처리 함수 주소를 모아 둔 배열 자체가 함수 포인터 표입니다