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 함수의 인자 전달
#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
'C, C++ > 열혈 C 프로그래밍' 카테고리의 다른 글
열혈 C 18장 다차원 배열 그리고 포인터 (0) | 2021.09.07 |
---|---|
열혈 C 17장 포인터의 포인터 (0) | 2021.09.07 |
열혈 C 16장 다차원 배열 (0) | 2021.09.06 |
열혈 C 14장 포인터와 함수에 대한 이해 (0) | 2021.09.03 |
열혈 C 13장 포인터와 배열 함께 이해하기 (0) | 2021.09.02 |