인프런 커뮤니티 질문&답변

davidkjcy님의 프로필 이미지
davidkjcy

작성한 질문수

독하게 시작하는 C 프로그래밍

함수 포인터 강의에서 질문이 있습니다.

해결된 질문

작성

·

140

0

int(*pfGetMax)(int,int,int) = GetMax; 를 통해

함수 포인터 선언 정의를 동시에 하고

printf("MAX: %d\n", pfGetMax(1,3,2)); 를 하셨는데

함수 포인터를 사용하여 GetMax 함수를 호출하는 과정에서

pfGetMax(1,3,2)를 사용하셨는데
이 표현이 이해가 가지 않았습니다.

포인터의 간접지정을 통해서 값을 가져와야 한다고 생각했는데

(*pfGetMax)(1,3,2) 처럼 해야하는 것이 아닌가요?

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

음...이해의 대상이 아니라 암기의 대상(문법)입니다. 함수호출 연산자의 피연산자는 함수형 주소(혹은 주소가 저장된 포인터)입니다. GetMax는 함수의 이름이며 실행코드가 저장된 메모리의 주소입니다. 그러나 pfGetMax는 포인터 변수입니다. 이에 대해 간접지정 연산을 수행할 경우 이는 함수에 대한 주소가 아니므로 함수호출연산자의 피연산자가 될 수 없습니다. 참고하시기 바랍니다. 😄

0

안녕하세요, 인프런 AI 인턴입니다. davidkjcy님, 함수 포인터에 관한 질문 감사합니다.

함수 포인터를 사용할 때, 함수 포인터 변수 pfGetMax를 호출할 때 (*pfGetMax)(1,3,2)와 같이 쓰는 것이 일반적인 포인터의 간접 참조 방식입니다. 하지만 C언어에서는 함수 포인터를 통해 함수를 호출할 때 간접 참조 연산자 (*)를 생략할 수 있으며, 이 경우에도 컴파일러가 이를 올바르게 해석하여 함수를 호출합니다. 따라서 pfGetMax(1,3,2)(*pfGetMax)(1,3,2)는 기능적으로 동일하게 작동합니다.

이는 함수 이름 자체가 함수의 시작 주소를 의미하는 포인터처럼 동작하기 때문에 가능한 것입니다. C언어의 포인터 문법은 다소 직관적이지 않을 수 있으므로, 이와 같은 특수한 경우에 혼란이 올 수 있습니다.

함수 포인터 사용에 더 자세히 알고 싶으시다면 해당 강의 내용을 다시 한번 꼼꼼히 확인해 보시거나, 추가 질문이 있으시면 언제든지 강의의 질문하기를 통해 질문하실 수 있습니다.

davidkjcy님의 프로필 이미지
davidkjcy

작성한 질문수

질문하기