(1)函數指針:
可以指向 一類 固定形參類型和返回值類型 的函數 的指針
聲明:
int fun(int, int)
||
\/
int (*pfun)(int, int)
pfun就是函數指針(變量)
調用:
d = pfun(a, b);
e = (*pfun)(a, b);
#####指針函數
int *fun(int, int);
int *(fun(int, int));
#####
/*ex01.c*/
#include <stdio.h>
int max(int a, int b) {
return (a > b ? a : b);
}
int min(int a, int b) {
return (a < b ? a : b);
}
int main(int argc, char *argv[]) {
int (*pfun)(int, int);
pfun = max;
int a = 0, b = 0, c = 0, d = 0, e = 0;
fscanf(stdin, "%d%d", &a, &b);
c = max(a, b);
d = pfun(a, b);
e = (*pfun)(a, b);
fprintf(stdout, "%d\n", c);
fprintf(stdout, "%d\n", d);
fprintf(stdout, "%d\n", e);
return 0;
}
(2)定義函數指針的類型 可以聲明函數指針變量
typedef int (*Pfun)(int, int);
Pfun就是自定義函數指針類型
Pfun pfun = min;
創建Pfun類型變量pfun並將min函數賦值它
/*ex02.c*/
#include <stdio.h>
typedef int (*Pfun)(int, int);
int max(int a, int b) {
return (a > b ? a : b);
}
int min(int a, int b) {
return (a < b ? a : b);
}
int main(int argc, char *argv[]) {
Pfun pfun = min;
int a = 0, b = 0, c = 0, d = 0, e = 0;
fscanf(stdin, "%d%d", &a, &b);
c = min(a, b);
d = pfun(a, b);
e = (*pfun)(a, b);
fprintf(stdout, "%d\n", c);
fprintf(stdout, "%d\n", d);
fprintf(stdout, "%d\n", e);
return 0;
return 0;
}
(3)可以將函數作為參數傳入另一函數
#include <stdio.h>
typedef int (*Pfun)(int, int);
int max(int a, int b) {
return (a > b ? a : b);
}
int min(int a, int b) {
return (a < b ? a : b);
}
int dofun(Pfun pfun, int a, int b) { //用Pfun類型的函數指針變量pfun接收傳入的函數
return pfun(a, b);
}
int main(int argc, char *argv[]) {
Pfun pfun = min;
int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0;
fscanf(stdin, "%d%d", &a, &b);
c = min(a, b);
d = pfun(a, b);
e = (*pfun)(a, b);
f = dofun(min, a, b); //將min函數作為參數傳入dofun,dofun用相應類型的函數指針接收
fprintf(stdout, "%d\n", c);
fprintf(stdout, "%d\n", d);
fprintf(stdout, "%d\n", e);
fprintf(stdout, "%d\n", e);
return 0;
return 0;
}
mxl033 回答是對的。
void* func(void)這種不是函數指針,而只是一個返回一個指針的函數。是函數,而不是指針。
typedef void (*pFunc)(); // 函數指針類型聲明,指向的是無返回無參數的函數.
typedef int (*pFunc1)(int,int); // 函數指針類型聲明,指向的是返回int型,參數有兩個int型的函數。
void func1()
{
printf("This is func1\n");
}
int add(int a, int b)
{
return a + b;
}
int main(void)
{
pFunc p = func1; // 函數指針復制
p();
// p = add; 錯誤,返回類型,和參數都不符合
pFunc1 p1 = add;
p1(1,2) // 返回3
return 0;
}
樓主可以慢慢體會,不懂再問吧
有函數: int fun(int a,int b);
要定義指向該函數的指針
對比指向 int a; 的指針
int *p; p = &a;
p的定義是怎麼來的?
首先要保證p是一個指針類型
寫下(*p),
然後,考慮下p的基類型,
p的基類型就是變量a的類型int
將int 放在(*p)前面就行了
int (*p);
括號可以省略,就成了 int *p;
同理
想要實現 pf = &fun;
(*pf) 將pf定義為一個指針,
將fun的類型作為pf的基類型
fun相當於一個 int (int a,int b)類型的量
int (int a,int b) (*pf);
基類型中有圓括號和中括號要後移
int (*pf)(int a,int b) ;//括號不能省略
pf = &fun;
調用時
(*pf)(3,4); pf(3,4)都可以