그라운드 임베디드 유튜브 구독

노트 / C 언어

포인터 심화와 함수 포인터

포인터 연산, 이중 포인터, 그리고 콜백과 상태 머신에 쓰는 함수 포인터를 정리했습니다.

GROUND EMBEDDED · 정리 노트C 언어 07포인터 심화와 함수 포인터 1typedef void (*handler_t)(uint8_t); 2handler_t on_rx = parse_command; 3on_rx(byte);// parse_command(byte) 실행

포인터 연산

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) 실행

펌웨어에서 쓰는 곳은 이렇습니다.

  • 콜백: 드라이버가 "수신 완료" 같은 일을 위쪽 코드에 알릴 때
  • 상태 머신: 상태마다 처리 함수를 표에 넣어 두고 현재 상태의 함수를 호출
  • 벡터 테이블: 인터럽트 처리 함수 주소를 모아 둔 배열 자체가 함수 포인터 표입니다