程序:求10个数的最大数
1、定义指向函数的指针变量调用函数的方法
一般定义形式为:类型名 (*指针变量名)();
#include
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
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;elsez = &y;return z;}
结果如下:
程序2:有3个学生,每个学生有4门课程的成绩。要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。
#include
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;
}
结果如下: