티스토리 뷰

반응형

함수 포인터에 대한 이해


예를 들어 Add와 Main 두 개의 함수로 이루어진 Test.exe 프로그램을 실행을 한다고 가정을 해보겠습니다. CPU를 통해 프로그램을 수행하기 위해서는 Add와 Main으로 구성 된 Text.exe를 하드디스크에서 가져와 메인 메모리에 위치 시켜야 합니다. 그리고 함수 포인터(함수의 이름)는 메인 메모리에 위치 한 Add나 Main을 가르키고 있는 포인터가 됩니다. 

 

함수 포인터 타입


함수의 포인터 타입을 결정짓는 요소는 리턴형과 전달인자입니다.

 

C
1
2
3
4
5
6
7
8
9
10
11
int fct1(int num1)    // 반환형이 int형이며 전달 인자 int형 변수 하나
{
    num1++;
    return num1;
}
 
double fct2(double num1, double num2) //반환형이 double형이고 전달 인자 double형 변수 두 개
{
    num1 = num1 + num2;
    return num1;
}

먼저 fct1 함수는 반환형이 int형이고 전달 인자가 int형 변수 하나인 함수이고 이것이 함수 fct1의 포인터 타입에 해당됩니다. 반면에 fct2는 반환형이 double형이고 전달인자가 double형 변수 두 개인 포인터 타입을 가지게 됩니다.

 

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
int fct1(int num1);
double fct2(double num1, double num2);
 
int main()
{
    //포인터 함수 선언
    int(*point_fct1)(int) = fct1;    
    double(*point_fct2)(doubledouble) = fct2;
 
    //포인터 함수를 통한 호출
    point_fct1(1);
    point_fct2(1.0, 1.0);
}
 
int fct1(int num1)    // 반환형이 int형이며 전달 인자 int형 변수 하나
{
    num1++;
    return num1;
}
 
double fct2(double num1, double num2) //반환형이 double형이고 전달 인자 double형 변수 두 개
{
    num1 = num1 + num2;
    return num1;
}

7번,8번 라인에서 포인터 함수를 선언하고 대입 연산자 오른쪽에는 함수의 이름이 오고 있습니다.

그리고 11,12번 라인에서 함수 포인터를 사용하여 fct1, fct2 함수를 각각 호출하고 있습니다.

 

 

■ void형 포인터


void형 포인터는 뭐든 담을 수 있는 바구니에 비유 할 수 있습니다. void형 포인터 변수를 선언하게 되면 변수이건, 함수이건, 포인터 변수까지도 저장을 할 수 있습니다.

 

1
2
3
4
5
6
7
8
9
int main()
{
    double num1 = 1.0;
    int num2 = 1;
 
    void *pointer;        //void형 포인터 선언
    pointer = &num1;    //void형 포인터에 int형 변수의 주소 저장
    pointer = &num2;    //void형 포인터에 double형 변수 주소 저장
}

위에 소스와 같이 void형 포인터 변수인 pointer 변수에 데이터형과는 상관 없이 어떠한 주소 값도 대입이 가능합니다. 다만 void형 포인터를 가지고는 아무런 작업을 수행 할 수 없습니다. 값을 변경하거나 참조하는 일들 또는 포인터 연산까지도 불가능합니다. void형 포인터의 쓰임새는 일단 주소 값을 저장해두고 형 변환을 통해서 포인터의 타입은 나중에 결정하는 것입니다.

 

1
2
3
4
5
6
int main()
{
    int num2 = 1;
    void *pointer = &num2;        
    *((int*)pointer) = 10;    // 값을 변경하기 위해서는 int*형으로 형변환
}

void형 포인터에 int형 변수의 주소를 저장하고 void 포인터를 통해 값을 변경하기 위해서는 int*형으로 형변환을 해줘야 합니다.

 

반응형