CafeM0ca

[C++]함수 포인터 본문

Programming/C++

[C++]함수 포인터

M0ca 2017. 11. 29. 04:13
반응형


포인터는 익숙하지만 함수 포인터는 '으음?..' 하는 느낌이다. 정리할 겸 예제를 통해 알아보려 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<iostream>
using namespace std;
 
const int Ex1(int n) {  
    cout << "인자값 : " << n << "\n";
    return n + 1;
}
const int Ex2(int n) {
    cout << "인자값 : " << n << "\n";
    return n + 2;
}
int main(void) {
    auto (*p)(int= Ex1; //함수 이름 자체는 그 함수의 주소
    cout << "Ex1함수 주소: " << Ex1 << ", 함수 포인터의 참조를 통한 주소: " << *<< endl;
    cout << "함수 포인터 변수 *p 값: " << (*p)(1<< endl;
 
    p = Ex2; //함수 이름 자체는 그 함수의 주소
    cout << "Ex2함수 주소: " << Ex2 << ", 함수 포인터의 참조를 통한 주소: " << *<< endl;
    cout << "함수 포인터 변수 *p 값: " << (*p)(2<< endl;
    
    if (Ex1 == Ex2)
        cout << "이름만 바뀔 뿐 달라진건 없잖아요?"//Ex2의 return값을 n+1로 할 경우 이를 출력
    else
        cout << "Ex1과 Ex2는 다른 주소입니다.\n";
 
    return 0;
}
 
cs


함수 포인터의 이점

코드가 간결해진다. 

유연성 (a함수를 사용하고 있는데 b함수로 바꿔야 된다면 함수 포인터에 b함수의 주소만 대입하면 되기 때문)

메모리적 이점

콜백(call back)함수에서 쓰임

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<iostream>
using namespace std;
 
const int Ex1(int n) {  
    cout << "인자값 : " << n << "\n";
    return n + 1;
}
const int Ex2(int n) {
    cout << "인자값 : " << n << "\n";
    return n + 2;
}
int main(void) {
    auto (*p)(int= Ex1; //함수 이름 자체는 그 함수의 주소
    cout << "Ex1함수 주소: " << Ex1 << ", 함수 포인터의 참조를 통한 주소: " << *<< endl;
    cout << "함수 포인터 변수 *p 값: " << (*p)(1<< endl;
 
    p = Ex2; //함수 이름 자체는 그 함수의 주소
    cout << "Ex2함수 주소: " << Ex2 << ", 함수 포인터의 참조를 통한 주소: " << *<< endl;
    cout << "함수 포인터 변수 *p 값: " << (*p)(2<< endl;
    
    if (Ex1 == Ex2)
        cout << "이름만 바뀔 뿐 달라진건 없잖아요?"//Ex2의 return값을 n+1로 할 경우 이를 출력
    else
        cout << "Ex1과 Ex2는 다른 주소입니다.\n";
 
    return 0;
}
 
cs

함수 포인터 *p를 auto형을 통해 초기화 하고있다.

여기서 일반 포인터와 다른점은 매개변수의 자료형을 명시해 줘야 한다는 점이다.

매개변수 자료형으로 auto는 사용하지 못한다. (auto에 대해 자세한건 추후 포스팅)


실행 결과


함수 포인터 배열로 사용법 (외울 때 앞에 있는게 주체로 외우면 편하다. 포인터 배열-> 포인터가 여러 개 선언됨)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<iostream>
using namespace std;
 
const int Ex1(int n) {
    cout << "인자값 : " << n << "\n";
    return n + 1;
}
const int Ex2(int n) {
    cout << "인자값 : " << n << "\n";
    return n + 2;
}
double Ex3(int n) {
    cout << "인자값 : " << n << "\n";
    return n + 1;
}
double Ex4(int n) {
    cout << "인자값 : " << n << "\n";
    return n + 2;
int main()
{
    const int (*parr1[2])(int= {Ex1,Ex2}; //const로 선언된 함수는 const로 배열 선언, auto는 사용불가
    double (*parr2[2])(int= {Ex3,Ex4}; //const로 선언되지 않은 함수는 const 선언을 제외한다.
    //typedef를 사용하면 아래와 같다.
    typedef const int (*parr1[2])(int);
    typedef const double (*parr2[2])(int);   
    parr1 p1 = {Ex1,Ex2};
    parr2 p2 = {Ex1,Ex2};
    //간결해 졌다. (큰 소스코드라면 더 빛을 볼 수 있다.)
}
 
cs


반응형

'Programming > C++' 카테고리의 다른 글

[C++] 런타임 과정에서의 입력 값  (0) 2017.12.02
[C++]inline  (0) 2017.11.29
[C++]cctype 라이브러리  (0) 2017.11.08
[C++11]range for문  (0) 2017.11.08
[C++11]배열과 문자열  (0) 2017.11.07
Comments