728x90
728x90

함수 포인터 : 윈도우 프로그래밍 API ... 이벤트 드리븐과 관련
void 포인터 : 메모리의 동적 할당과 관련

 

함수 포인터

함수의 이름은 포인터다.
함수가 실행될 경우 그 메모리공간을 가리킨다.

사실 fct(a,b) 같은건 fct함수가 가리키는 메모리공간 안에 존재하는 fct함수를 가리키면서 인자를 전달한다는 뜻이었다.

 

함수 포인터 타입

함수포인터는 주소(함수가 존재하는 위치를 가리키는) 와 자료형정보가 있을 것
함수포인터의 타입을 결정 짓는 요소는 리턴타입 + 매개변수타입 이다.

// fct1의 포인터 타입은 리턴타입int, 매개변수타입 int형 데이터를 
// 하나 받을 수 있는 함수를 가리킬 수 있다.
// 포인터  int (*fPtr1)(int); 얘는 변수
// fct1은 상수
int fct1(int a) {
    a++;
    return a;
}

// 리턴타입 더블이고 인자값으로 더블형 데이터 2개를 받을 수 있는
// 함수를 가리킬 수 있는 함수 포인터다.
// 포인터는 double (*fPtr2)(double, double);
// *fPtr2과 fct2는 타입이 같으나 변수, 상수인지만 다르다.
// *fPtr2과 fct2는 타입이 같아 대입이 가능하다.
double fct2 (double a, double b) {
   double add=a+b;
   return add;
}

 

예제

#include <stdio.h> 

void Add(int a, int b);
void SPrint(char* str);

int main()
{
    char* string = "Function Pointer";
    int a=10, b=20;
    
    void (*fPtr1)(int, int)=Add;
    void (*fPtr2)(char*)=SPrint;
    
    printf("%d, %d\n", Add, fPtr1); // 같은 주소값 
    
    // 함수 포인터에 의한 호출
    fPtr1(a, b);
    fPtr2(string);
    
    // 함수 이름으로 호출
    Add(a,b);
    SPrint(string);
    
    return 0;
}

void Add(int a, int b){
    printf("덧셈 결과 : %d\n", a+b);
}

void SPrint(char * str){
    printf("입력 문자열 : %s\n", str);
}

 

 

void형 포인터

자료형에 대한 정보가 제외된 주소 정보를 담을 수 있는 형태의 변수

char c='a';
int n = 10;
void* vp; //void 포인터 선언
vp=&c;
vp=&n;

 

주소값을 저장할 수 있는 메모리공간(변수)이나 일반적 포인터와 달리
void형 포인터는 저장할 수 있는 저장할 수 있는 주소값의 형태가 제한되어 있지 않다 

int* a, char* b 등은 자료형이 제한적이나
void* c는 int/char 등 변수의 주소값 int형 포인터의 주소값까지 전부 저장이 가능하다.

 

오히려, 만능이 아니라 제한된 형태의 기능을 지닌다
타입 정보가 없어 포인터 연산, 메모리 참조와 관련된 일에 활용할 수 없다.

 

int n = 10;
void* vp = &n; //몇 바이트를 참조할 지 애매해진다. 주소값만 갖고 있다
*vp=20; //Error
vp++; //Error

 

malloc 함수, 동적할당 시 void형 포인터가 활용될 것이다.

 

 

main 함수의 인자 전달

argv로는 배열요소의 주소값을 전달한다

 

 

#include <stdio.h> 

 
int main(int argc, char **argv)
{
    int i=10;
    printf("전달된 문자열의 수 : %d\n", argc);
    
    for(i=0; i<argc; i++){
        printf("%d번째 문자열 : %s\n", i+1, argv[i]);
    }
    
    return 0;
}
728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v