程序:求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<stdio.h>
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;
}
结果如下: