함수를 가리키는 포인터 vs 포인터를 반환하는 함수
1. 1번 질문에 대해서는 "함수 선언/정의 시 함수명 앞에 나오는 각종 자료형은 곧 그 함수의 반환형이다"로 이해하시면 됩니다.
2. 2번 질문에 대해서는 "그져 규칙이 그런것이다"로 답하고 싶습니다.
double *ptu(int);를 설명하자면,
int 형의 매개변수를 하나 받아서 작업을 한 후 double* 을 반환하는 함수 ptu입니다.
(double* 은 double형 변수를 가리키는 포인터)
3. 함수가 있을 때 그 함수를 가리키는 포인터 형을 만드는 방법을 말씀드리겠습니다.
double *ptu(int);
위와같은 함수가 있다면 먼저 함수 이름부분만 괄호로 묶습니다.
double *(ptu)(int); //아직까지는 위와 동일한 함수선언임
그런 다음 괄호안의 함수이름 앞에 포인터형임을 표시하는 *를 추가합니다.
double *(*ptu)(int); //이제야 함수를 가리키는 포인터가 됐음.
이 것은 "int 형의 매개변수 하나를 받아 작업을 한 후 double 형 변수를 가리키는 포인터를 반환하는 함수"를 가리키는 포인터를 선언/정의한 것입니다.
이 형으로 cast 할 때는 변수 이름만 빼고 전체를 ()로 묶으면 됩니다: (double *(*)(int))
그럼, 다음은 무슨 뜻일까요? typedef double *(*SomeType)(int);
4. double *(*ptu)(int);와 같은 선언이 있는 경우 그게 가리키는 함수가 어떤 것인지 알아보려면 위의 역순으로 해보면 되겠지요.
5. 3번을 이해하셨으면 '함수를 가리키는 포인터'인지 '포인터를 반환하는 함수'인지 구별할 수 있으실겁니다.
#include <iostream>
double *func(int); //함수 선언 //double *(func)(int);으로 해도 무방
int main(void)
{
double *(*ptu)(int) = func; //함수 포인터 변수 선언/정의 및 초기화
for(int i=1; i<=3 ;++i){
//함수 포인터를 사용한 함수 호출
//여기서 ptu(i)로 하지 않고 *ptu(i)로 한 이유는 반환형이 포인터이기 때문임.
//만약, ptu(i)로 하면 func 함수 내부에 있는 aDouble 변수의 번지가 출력됨.
std::cout << *ptu(i) << std::endl;
}
return 0;
}
double *func(int aInt)
{
static double aDouble=0.14f;
aDouble = aDouble + aInt;
return &aDouble; //만약 aDouble이 static이 아니라면 이렇게 번지를 반환하는 건 삼가야 함.
//(static이 아닌 함수 내부의 지역변수는 함수 실행 종료시 사라지게 됨)
}
김광수 님이 쓰신 글 :
: 안녕하세요 간단한건대 햇갈려서 질문합니다
: 자세하게좀 답변해주심 감사하겟어용
:
: 1.double (*ptu)(int);
: ->여기서 ptu는하나의 int를 전달인자로 취하고 double를 리턴하는 함수를 가르킨다고 하던대
: double은 이 함수의 자료형이자나요 근대 자료형이 곧 리턴값은 아니자나요? 책이 잘못나온건가요?
:
: 2.double *ptu(int);
: ->여기서 ptu()는 포인터를 리턴하는 함수라는데
: 왜 포인터를 리턴하는 함수인지 모르겠습니다.
:
: 위에 질문은 그냥 책에 나온 포인터관련 내용입니다.
|