rudgks33   2년 전

제가 공부한 포인터는 포인터가 가리키는 변수의 주소값을 저장하는 것으로 알고 있습니다.

또한 포인터는 배열처럼 사용이 가능하고, 배열과의 차이는 배열은 메모리를 정적으로 할당받고, 포인터는 동적으로 할당 받는거로 알고 있습니다.

그렇다면 함수와 함수포인터의 차이도 함수포인터를 함수처럼 사용할 수 있고, 차이도 메모리의 할당방식만 차이가 있는 것일까요?

그리고 함수포인터를 왜 사용해야 하는지, 어떠한 경우에 사용하는지 궁금합니다! 오늘도 좋은 하루 되세요~


uuiip7878   2년 전

일단 첨부해주신 코드에 대해 말해드리자면 함수 포인터 안에 내용을 두면 안 됩니다. 반환 자료형이 같아야 하고, 인자가 같고(이때 변수 이름 비워두셔야 합니다!!) 내용이 없으면 아마 될 겁니다.
위에 예제와 비교하자면 int (*ptr)(int,int*);같이요.
*ptr에 괄호를 씌운 것은 함수가 int* ptr (즉, 정수 포인터를 반환하는 함수)로 인식하지 않게 하려고 하는 겁니다.

함수 포인터는 단순히 그냥 주소 저장 조건이 약간 더 까다로운 포인터(함수 버전)라고 알고 있습니다. 그리고 여기서 일반적인 포인터와 차별화되는 게 함수는 new 키워드(혹은 malloc)를 사용할 수 없죠? 동적 할당을 사용할 수 없다는 얘깁니다. 대신 int (*ptr[10])(int,int*);같이 포인터 함수 배열을 만들어서 사용할 수는 있습니다.
이 말은 곧 함수 포인터를 만들더라도 이는 단순히 대입된 함수를 가리키는 역할만 할 겁니다.

그리고 용도같은 경우 std::sort의 비교 함수 오버로딩을 생각하시면 될 것 같습니다. 안 써보셨다면... 그냥 함수가 가변적으로 사용되어야 할 위치(계산기의 사칙연산 함수 등등)와 같은 곳에서 코드를 조금 더 압축?하는데 쓰인다고 보시면 될 것 같아요.

C 환경에서 작업하고 계신다면 한 가지 더 용도가 있긴 합니다. 함수 포인터는 이름과 다르게 변수 취급입니다. 이걸 다른 말로 한다면 구조체의 멤버로 들어갈 수 있다는 겁니다.
C++이라면 함수를 직접적으로 struct(혹은 class)에 넣을 수 있으나, 이걸 응용하면 함수를 넣을 수 없는 C의 struct에서도 함수를 넣어서 가지고 다니는 것이 가능합니다.

어쩌다보니 좀 장황하게 설명드리게 됐네요. 저도 아직 배워가는 입장이라 아마 이 설명으로는 부족한 부분이 많을테니 더 궁금하신 부분은 직접 구글신에게 검색해서 알아보시는 걸 추천드립니다.

댓글을 작성하려면 로그인해야 합니다.