공부/C언어

C언어 - (16) : 함수, 보이드 포인터

BKM 2024. 10. 17. 00:24

함수 포인터

우리가 함수를 선언할 때 적어주는 '함수의 이름'은 사실 함수가 저장된 메모리 공간을 가리키는 포인터의 역할을 한다.

일반 변수와 마찬가지로, 함수의 이름이 가리키는 메모리 주소값은 '함수 포인터 변수'를  선언해서 저장해주어야 하며,

'함수 포인터 변수'를 선언하기 위해서는 그에 해당하는 함수 포인터의 형(type)을 마찬가지로 알아야 한다.

 

'함수 포인터의 형'에 대한 정보는 '함수의 반환 형'과 '매개변수'에 대한 정보를 참고하면된다.

따라서, '함수의 반환 형'과 '매개변수'가 동일한 서로 다른 함수는 '동일한 함수 포인터 변수를 공유'할 수 있다.

 

예를 들어, `int Function1(int num)`과 `int Function2(int num)`은 반환 형(int)과 매개변수(int 1개)가 동일하므로

동일한 함수 포인터 변수를 사용할 수 있다.

함수 포인터 변수의 선언 방법

`int (*fptr) (int)`와 같은 방식으로 함수 포인터 변수를 선언 가능하다.

  • int : 함수의 반환형
  • fptr : 포인터 변수의 이름
  • int : int형 매개변수 1개

2개 이상의 매개변수가 존재할 경우에는 `반환형 (*포인터 변수명) (매개변수 형1, 매개변수 형2)`와 같은 방식으로 사용하면 된다.

#include <stdio.h>

void SimpleAdder(int n1, int n2)
{
    printf("%d + %d = %d \n", n1, n2, n1+n2);
}

void ShowString(char * str) // 상수 문자열을 포인터 변수에 저장했으므로, 포인터 변수를 매개변수로 지정
{
    printf("%s \n", str);
}

int main(void)
{
    char * str = "Function Pointer"; // 상수 문자열을 가리키는 포인터 변수
    int num1=10, num2=20;

    void (*fptr1)(int, int) = SimpleAdder;
    void (*fptr2)(char *) = ShowString;

    // 함수 포인터에 의한 함수 호출
    fptr1(num1, num2);
    fptr2(str);
    return 0;
}

위의 예시 코드처럼 함수 포인터 변수를 선언하고, 선언된 함수 포인터 변수를 사용해 함수를 호출할 수 있다.

void 포인터

`void * ptr;`

'void 포인터'형(type)이 존재하지 않는 포인터로, 자료형에 상관없이 어떠한 주소 값도 저장이 가능한 포인터이다.

int num=20;
void * ptr=&num;
*ptr = 20; // 컴파일 에러
ptr++; // 컴파일 에러

하지만 동시에, 형에 대한 정보가 존재하지 않기 때문에 *을 활용한 연산(메모리 연산) 역시 불가능하다.

 

void 포인터 사용 예시

// void pointer
#include <stdio.h>

void SimpleFunc(void)
{
    printf("I'm so Simple \n");
}

int main(void)
{
    int num=20;
    void * ptr; // void pointer

    ptr = &num; // int 변수를 가리키는 포인터
    printf("%p \n", ptr);

    ptr=SimpleFunc; // 함수를 가리키는 포인터
    printf("%p \n", ptr);
    return 0;
}

[참고] main 함수를 통한 인자의 전달

https://blog.naver.com/sharonichoya/220501242693

 

C언어 main( ) 함수의 명령 인수 (argc, argv)

* main 함수의 매개변수는 보통 아무것도 사용하지 않지만(int main ( ) ) 경우에 따라서는 int main (int ...

blog.naver.com