C언어의 함수에 관해서는 이전 포스팅에서 설명했다.
https://ansan-survivor.tistory.com/1224
C언어 함수의 구조는 아래와 같다.
[return 타입] 함수명( [input타입 변수명] )
ex) int main( int a )
함수명은 말 그대로 함수 이름 지정.
input 은 이 함수가 실행되기 위한 입력 값을 지정하는것.
return 타입은 이 함수가 연산이되어 return되는 값의 타입.
즉 자세히 보면, 2가지의 Type이 선언되어야 한다.
1. input이 되는 값의 타입
2. return되는 인자의 타입
함수는 컴파일시 그 이름 자체로 메모리에 있는 특정 주소값으로 치환된다. 즉 함수 이름자체는 "상수형 포인터"이다.
즉, 함수의 이름 그자체는 실제로 메모리의 특정 주소값 (0x0000)를 가리키고 있는 포인터 이다.
다만 함수이름 포인터는 input인자의 type정보와, return인자의 type정보가 함께 제공되어야 한다. (void가 아니라면)
* 함수포인터를 선언하는 방법
1. 함수의 이름은 함수가 저장된 메모리공간을 가리키는 상수형 포인터이다. (함수 이름 자체는 상수형 타입으로 변경 불가)
2. 함수이름의 의미하는 '주소값' 은 "함수 포인터 변수"를 선언해 저장가능. (함수의 주소값을 가리키는 변수 선언 가능)
3. 함수포인터변수를 선언하려면, 사용할 함수의 반환, 매개변수 Type(자료형)을 알아야 한다.
아래 예제에서는 2개의 함수를 선언했다.
그리고
int (*fptr) (int, int); <= input parameter의 이름은 중요하지 않다. type만 넣으면 된다. (2개가 입력되므로 int, int)
void (*ptrstring) (char*);
두 함수포인터를 선언해서 사용.
#include <stdio.h>
/*
포인터를 선언하기 위해서는, 주소값과 자료형이 주어져야 하는데, 함수의 이름을 다음과 같이 생각하고 포인터를 선언한다.
함수 읽기. (함수포인터를 선언하기 위하여)
ex) int fct(int a );
1.
이 함수의 주소값은? fct의 주소. (함수이름 = 주소값)
2.
type형은? "Parameter가 int 이고, return값이 int 이다."
ex) double Fct (double a , double b );
1.
함수의 주소값? 함수이름 Fct 의 주소.
2.
type형은? "Parameter가 2개의 double, return값이 double 이다."
아래 예제에서 선언한 함수포인터변수 2개.
int (*fptr) (int, int);
void (*ptrstring) (char *);
*/
int fct(int a, int b)
{
int c = 0;
c = a - b;
return c;
}
void ShowString(char* str)
{
printf("%s \n", str);
}
int main()
{
char* str = "ich liebe dich";
// 함수포인터를 선언하기!!
// [자료형: 매개변수 int형인, 리턴값이 int형 2개인] 포인터함수 fptr 를 선언!!
// 함수이름은 의미없다. *만 있으면 될뿐, 그러나 자료형은 반드시 일치해야 한다.
int(*fptr) (int, int);
fptr = fct; // fptr -> fct의 주소를 가리킴. (함수이름이 주소값이므로)
// 상수 함수 포인터로 출력
printf("%d \n", (fct(5, 7)));
// 변수 함수 포인터로 출력
printf("%d \n", (fptr(10, 15)));
// 함수 포인터 선언하기.
// 자료형: char * (케릭터 포인터형을 매개변수로 받고, return값은 없다)
void(*ptrstring)(char*);
// ptrstring -> ShowString함수를 가리킴.
ptrstring = ShowString;
ShowString(str);
ptrstring(str);
return 0;
}
/*
fct 는 '상수' 함수포인터 이름이 될 수 있다! (변경 불가)
fptr 은 '변수' 함수포인터 이름이 될 수 있다! (변경 가능)
*/
(결과)
받는 인자 int, int 와 출력인자 int 타입인 *fptr 이름의 함수포인터를 선언.
fptr = fct
위 과정을 아래와 같이 도식화 하면,
함수 fct는 이미 특정 메모리주소에 '상수형포인터' 으로써 저장되고,
함수포인터가 선언되고 그 함수를 인자로 받게 되면, 이제 그 함수를 가리키게 된다.
함수포인터는 '변수형포인터' 으로 동일하게 사용한다.
문자열도 마찬가지로 함수포인터를 선언하면 동일하게 사용 가능하다.
'C언어 \ C++ > 포인터 \ 배열' 카테고리의 다른 글
[C언어] 구조체(struct)에 포인터 변수 선언, 사용방법 ( -> 연산자) (0) | 2022.03.05 |
---|---|
[C언어] Void 포인터 (함수 주소 저장, 값 주소 저장 만능상자) (0) | 2022.02.20 |
[C언어] 포인터 배열, 이중포인터 배열 예제 (배열 내 포인터값을 사용할 경우) (0) | 2022.02.19 |
[C언어] 포인터의포인터(더블포인터) Swap함수 예제 (0) | 2022.02.19 |
[C언어] 포인터의 포인터 (더블 포인터, 이중 포인터, 삼중 포인터) 이해하기 예제 (2) | 2022.02.19 |