程序:求10个数的最大数
1、定义指向函数的指针变量调用函数的方法
一般定义形式为:类型名 (*指针变量名)();
- #include<stdio.h>
- int main()
- {
- int i, m, a[10], max(int* p);
- int (*f)();
- for (i = 0; i < 10; i++)
- scanf_s("%d", &a[i]);
- f = max;//max就是函数的地址,f也是地址
- m = (*f)(a);//a是实参
- printf("max=%d\n", m);
- return 0;
- }
- max(int* p)
- {
- int i, t = *p;
- for (i = 1; i < 10; i++)
- if (*(p + i) > t)
- t = *(p + i);
- return t;
- }
注意,指针变量的数据类型必须与被指向的函数类型一致
2、用指向函数的指针作为函数参数
在函数调用时把某几个函数的首地址传递给被调用函数,在被调用函数中就可以调用这几个函数了。
程序:编制函数func(),调用实现不同的功能:max,min,sum.
代码如下:
- #include
- int max(int a, int b);
- int min(int a, int b);
- int sum(int a, int b);
- void func(int a, int b, int(*fun)(int a, int b));
-
- int main()
- {
- int x, y;
- printf("enter 2 num:\n");
- scanf_s("%d%d", &x, &y);
- printf("max = ");
- func(x, y, max);//max必须先定义为一个函数,以下同理
- printf("min = ");
- func(x, y, min);
- printf("sum = ");
- func(x, y, sum);
-
- }
- void func(int a, int b, int (* fun)(int a, int b))
- {
- int result;
- result = (*fun)(a, b);
- printf("%d\n", result);
- }
- int max(int a, int b)
- {
- int c;
- c = (a > b) ? a : b;
- return c;
- }
- int min(int a, int b)
- {
- int c;
- c = (a < b) ? a : b;
- return c;
- }
- int sum(int a, int b)
- {
- int c;
- c = a + b;
- return c;
- }
第一次调用func函数时,除了将x,y传递给形参a,b外,还将函数名max作为实参传递给形参fun,这是fun指向函数max();此时,func函数中的(*fun)(a,b)相当于max(a,b).
3、返回指针值的函数
一般定义类型为:
类型名 *函数名(参数表)
例如:int *maxc(int x, int y)表示调用后可以得到一个指向整型数据的指针(地址)。
*的运算级低于(),因此maxc先于()结合,表明maxc是函数名。*表示此函数返回值类型是指针。
程序1:下列函数把两个整数形参中较大的那个数的地址作为函数值传回
- #include<stdio.h>
- int main()
- {
- int* maxc(int x, int y);//maxc函数返回的类型是地址!
- int* p, i, j;
- printf("enter two number\n");
- scanf_s("%d%d" ,&i, &j);
- p = maxc(i, j);//p作为地址
- printf("max=%d\n", *p);
- return 0;
- }
- int* maxc(int x, int y)
- {
- int* z;
- if (x > y)
- z = &x;
- else
- z = &y;
- return z;
-
- }
结果如下:

程序2:有3个学生,每个学生有4门课程的成绩。要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。
- #include<stdio.h>
- int main()
- {
- float score[][4] = { {60,70,80,90},{56,89,67,88},{34,78,90,66} };
- float* search(float(*pointer)[4], int n);//函数形参为指向行的指针
- float* p;
- int i, k;
- printf("enter the number of student:");
- scanf_s("%d", &k);
- printf("the scores of NO.%d are:\n", k);
- p = search(score, k);//p是地址
- for (i = 0; i < 4; i++)
- printf("%5.2f\t", *(p + i));//这里的p已经是&score[][0]了
- printf("\n");
- return 0;
- }
-
- float* search(float(*pointer)[4], int n)
- {
- float* pt;
- pt = *(pointer + n - 1);//第n位同学的列地址&score[n-1][0]
- return pt;
- }
结果如下:

指针变量总结:
