Skip to main content

Command Palette

Search for a command to run...

함수 포인터와 void 포인터

Updated
3 min readView as Markdown

함수 포인터의 이해

  • 프로그래머가 정의하는 모든 함수는 프로그램 실행 시 ‘메인 메모리'에 저장되어서 실행

  • 함수의 이름은 메모리상에 저장된 함수의 주소 값을 의미

int SimpleFunc(int num) { . . . . }  // 반환형이 int이고 매개 변수로 int형 변수가 하나 선언된 포인터 형(type)
/*
반환형 int
매개변수 선언 int num

함수 이름의 포인터 형은 반환형과 매개 변수의 선언을 통해서 결정 짓도록 약속되어 있다.
*/

적절한 함수 포인터 변수의 선언

int (*fptr) (int)  // fptr은 포인터
int (*fptr) (int)  // 반환형이 int인 함수 포인터
int (*fptr) (int)  // 매개 변수 선언이 int 하나인 함수 포인터
int SoSimple(int num1, int num2) { . . . . }
int (*fptr) (int, int);
fptr=SoSimple;
fptr(3, 4);  // SoSimple(3, 4)와 동일한 결과를 보임
#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;
}

/* 결과
10 + 20 = 30
Function Pointer
*/
#include <stdio.h>

int WhoIsFirst(int age1, int age2, int (*cmp)(int n1, int n2))
{
    return cmp(age1, age2);
}

int OlderFirst(int age1, int age2)
{
    if(age1>age2)
        return age1;
    else if(age1<age2)
        return age2;
    else
        return 0;
}

int YoungerFirst(int age1, int age2)
{
    if(age1<age2)
        return age1;
    else if(age1>age2)
        return age2;
    else
        return 0;
}

int main(void)
{
    int age1=20;
    int age2=30;
    int first;

    printf("입장순서 1 \n");
    first=WhoIsFirst(age1, age2, OlderFirst);
    printf("%d세와 %d세 중 %d세가 먼저 입장! \n\n", age1, age2, first);

    printf("입장순서 2 \n");
    first=WhoIsFirst(age1, age2, YoungerFirst);
    printf("%d세와 %d세 중 %d세가 먼저 입장! \n\n", age1, age2, first);
    return 0;
}

/* 결과
입장순서 1 
20세와 30세 중 30세가 먼저 입장! 

입장순서 2 
20세와 30세 중 20세가 먼저 입장! 

3행: 매개 변수의 선언으로 함수 포인터 변수를 선언해 반환형이 int이고 두 개의 int형 변수가 매개 변수로 선언된 함수의 이름(함수의 주소 값)이 전달되어야 함
5행: 첫 번째, 두 번째 인자를 재 전달하면서 세 번째 인자로 전달된 함수를 호출 -> 이 떄 반환되는 값을 재 반환
*/

형(Type)이 존재하지 않는 void 포인터

⁠void * ptr;

#include <stdio.h>

void SoSimpleFunc(void)
{
    printf("I'm so simple");
}

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

    ptr=&num;       // 변수 num의 주소 값 저장
    printf("%p\n", ptr);

    ptr=SoSimpleFunc;       // 함수 SoSimpleFunc의 주소 값 저장
    printf("%p\n", ptr);
    return 0;
}

/* 결과
0x16f30ef58
0x100af3ef8

"일단 주소 값에만 의미를 두고, 포인터의 형은 나중에 결정한다."
*/

main 함수로의 인자전달

main 함수를 통한 인자의 전달

char * argv[]

void SimpleFunc(char ** arr) { . . . . }
void SimpleFunc(char * arr[]) { . . . . }

/* argv는 char형 더블 포인터 변수 */
#include <stdio.h>

void ShowAllString(int argc, char * argv[])
{
    int i;
    for(i=0 ; i<argc ; i++)
        printf("%s\n", argv[i]);
}

int main(void)
{
    char * str[3]={
        "C Programming",
        "C++ Programming",
        "JAVA Programming"
    };
    ShowAllString(3, str);
    return 0;
}

/* 결과
C Programming
C++ Programming
JAVA Programming

3행: argv는 char형 더블 포인터 변수, char **형 데이터가(주소 값이) 전달
12행: 1차원 배열이름의 포인터 형은 배열이름이 가리키는 대상을 통해서 결정, 배열이름 str이 가리키는 첫 번째 요소가 char*형 데이터이므로,
배열이름 str의 형은 char**이다.
*/

More from this blog

선행처리기와 매크로

선행처리는 컴파일 이전의 처리를 의미 선행처리는 선행처리기에 의해서, 컴파일은 컴파일러에 의해서, 링크는 링커에 의해서 진행 소스파일 → 선행처리기 → 선행처리 거친 소스파일 → 컴파일러 → 오브젝트 파일 → 링커 → 실행파일 컴파일 과정을 거치게 되면 바이너리 데이터로 이루어진 오브젝트 파일이 생성 선행처리기가 하는 일 삽입해 놓은 선행처리 명령문대로 소스코드의 일부를 수정 여기서 수정이란, 단순 치환의 형태 /* 간단한 선행처리 명령문 */...

Oct 10, 20246 min read

C 언어의 메모리 구조

프로그램을 실행하면 해당 프로그램의 실행을 위한 메모리 공간이 운영체제에 의해서 미리 마련 그리고 바로 이 메모리 공간 내에서 변수가 선언되고, 문자열이 선언되는 것 메모리의 구성 프로그램 실행 시 운영체제에 의해서 마련되는 메모리의 구조는 네 개의 영역으로 구분 코드 영역 / 데이터 영역 / 힙 영역 / 스택 영역 메모리 공간을 나눠놓은 이유는 유사한 성향의 데이터를 묶어서 저장을 하면, 관리가 용이해지고 메모리의 접근속도가 향상 메모리 영역...

Oct 9, 20246 min read

파일과 스트림(Stream), 그리고 기본적인 파일의 입출력

저기 저 파일에 저장되어 있는 데이터를 읽고 싶어요. 프로그램 상에서 파일에 저장되어 있는 데이터를 참조하길 원한다고(읽기 원한다고) 가정했을 때, 우리가 구현한 프로그램과 참조할 데이터가 저장되어 있는 파일 사이에 데이터가 이동할 수 있는 다리를 놓는 일을 먼저 해야 한다. 이러한 데이터 이동의 경로가 되는 다리를 가리켜 ‘스트림(stream)’이라 함. 스트림이라는 것은 운영체제에 의해서 형성되는 소프트웨어적인 상태를 의미하는 것 따라서, ...

Oct 8, 20249 min read

JinGood

31 posts