**指针函数 : 指带指针函数,即本质是一个函数,函数返回类型为某种类型的指针 类型标识符 函数名(参数列表) int f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。 int *f(x,y); int *p=NULL; p=f(x,y); 输入第几周的第几天获取这天是这个月的几号 #include<stdio.h> int * GetDate(int wk, int dy); //声明指针函数 void main() { int wk, dy; do { printf("Enter week(1 - 5)day(1 - 7)\n"); scanf("%d%d", &wk, &dy);
} while (wk < 1 || wk>5 || dy < 1 || dy>7);
printf("%d\n", *GetDate(wk, dy)); //调用,GetDate()函数返回的是一个指针(地址),
//* GetDate()则是取其内容 }
int * GetDate(int wk, int dy) { static int calendar[5][7] ={{1, 2, 3, 4, 5, 6, 7}, {8, 9, 10, 11, 12, 13, 14}, {15, 16, 17, 18, 19, 20, 21}, {22, 23, 24, 25, 26, 27, 28}, {29, 30, 31, -1}}; return &calendar[wk - 1][dy - 1]; //返回一个地址 }
函数指针 是指向函数的指针变量,即本质是一个指针变量 int (*f)(int x); 指向函数的指针包含了函数的地址的入口地址,可以通过它来调用函数。声明格式如下: 类型说明符 (*函数名) (参数)
其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明必须和它指向函数的声明保持一致。 指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。 把函数的地址赋值给函数指针: f=&fun; 或者f=fun; 取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。 通过指针调用函数: x=(*f)(); 或者x=f(); 代码: #include<stdio.h> void(*funcp)(); //声明函数指针 void FileFunc(), EditFunc(); void main() { funcp = FileFunc; //赋值 (*funcp)(); //调用 funcp = EditFunc; //赋值 (*funcp)(); //调用 }
void FileFunc() { printf("FileFunc\n"); } void EditFunc() { printf("EditFunc\n"); }
执行结果: FileFunc EditFunc
主要的区别是一个是指针变量(函数指针),一个是函数(指针函数)