天天看点

C:函数指针&指针函数

函数指针

1) 函数指针:本质是一个指针,但这个指针指向的是函数,并不是普通的基本数据类型或者类对象。

      ( 函数指针可以像一般函数一样,用于调用函数、传递参数。)

2) 定义:type (*func)(type , type )

           eg:int  (*fun)(int  a, int  b);   // 声明函数指针

          // 该函数指针 fun 是一个指向(返回值为整型,有两个参数类型都是整型)的函数

3)代码:

a.函数指针直接调用

#include<stdio.h> 

int max(int x, int y)
{
	return x > y ? x : y;
}

int main(void)
{
	/* p 是函数指针 */
	int(*p)(int, int) = &max; // &可以省略
	int a, b, c, d;

	printf("please input 3 numbers:");
	scanf("%d %d %d", &a, &b, &c);

	/* 与直接调用函数等价,d = max(max(a, b), c) */
	d = p(p(a, b), c);

	printf("the maxumum number is: %d\n", d);

	return 0;
}
           

b.函数指针作为参数

#include<stdio.h>

int compare(int* a, int* z)
{
	return *a < *z ? 1 : 0;
}

int *maximum(int* begin, int* end, int(*compare)(int*, int*))
//函数指针 compare 是一个指向(返回值为整型,有两个参数类型都是指针型)的函数
{
	int* result = begin;
	while (begin != end)
	{
		if (compare(result, begin))
		{
			result = begin;
		}
		++begin;
	}
	return result;
}

int main()
{
	int data[8] = { { 0 },{ 1 },{ 2 },{ 3 },{ 8 },{ 5 },{ 6 },{ 7 } };
	int* max;
	max = maximum(data + 0, data + 8, &compare);
	printf("%d\n", *max);
	return 0;
}
           

指针函数

1) 指针函数:本质是一个函数,但这个函数返回的是一个对应类型的地址(返回一个地址给调用者)。

2) 定义:type  *func (type , type)

           eg:int  *fun(int a, int b); //声明指针函数  也可写成 int* fun(int a, int b);

            // fun是函数名,返回值是一个int类型的指针

3)代码:

#include<stdio.h>

float *find(float(*pionter)[4], int n)//find()被定义为指针函数  pointer是指向包含4个元素的一维数组的指针变量
{
	float *pt;
	pt = *(pionter + n);// pointer+n 指向 score 的第 n+1 行   pt[i]表示第 i 行
	return pt;
}

int main()
{
	static float score[][4] = { { 60,70,80,90 },{ 56,89,34,45 },{ 34,23,56,45 } };
	float *p;
	int i, m;
	printf("Enter the number to be found:");
	scanf_s("%d", &m);
	printf("the score of NO.%d are:\n", m);
	p = find(score, m - 1);//find(score,1)表示第二位学生成绩
	for (i = 0; i < 4; i++)
	{
		//printf("%5.2f\t", *(p + i));
		printf("%5.2f\t", p[i]);// p[i] 表示第 m-1 位学生的第 i 门成绩
	}
	printf("\n");
	return 0;
}
           

总结:

       函数指针与指针函数的最大区别是:函数指针的函数名是一个指针,即函数名前面有一个指针类型的标志型号“*”。

(ps:函数指针的返回值也可以是指针)

继续阅读