文章目录
一、函数指针的概念
二、函数指针的应用
(1)调用函数
(2)将函数的地址作为函数参数传入其他函数。
三、实例演示
一、函数指针的概念
函数指针的定义
若在程序中定义了一个函数,编译时,编译器会为函数代码分配一段存储空间,这段空间的起始地址(又称入口地址)称为这个函数的指针。
与普通变量相同,可以定义一个指针指向存放函数代码的存储空间的起始地址,这样的指针就是函数指针。
函数指针的定义格式如下:
返回值类型 (*变量名)(参数列表)
返回值类型是指针指向函数的返回值类型,*表示一个指针变量,参数列表是指针指向函数的形参列表。
【注释】因为*的优先级较高,所以要将*和变量名括起来
实例:
int func(int a,int b);//函数声明
int (*p) (int , int );//定义一个参数列表为两个int型的变量,返回值类型为int型的函数指针p
p=func;//函数指针p指向函数func的起始地址
二、函数指针的应用
(1)调用函数
使用函数指针调用对应函数,方法和使用函数名调用函数类似,只需将函数名替换成(*指针名)
调用函数指针p指向的函数
(*p)(3,5);
(2)将函数的地址作为函数参数传入其他函数。
将函数的地址传入其他参数,就可以在被调函数中使用实参函数。
将func的地址作为参数传入func2函数
void func2(int(*p)(int,int),int b,int c);
三、实例演示
#include <stdio.h>
void sum_row(int(*arr)[4], int raw, int* sum);//行求和函数声明
void sum_col(int(*arr)[4], int raw, int* sum);//列求和函数声明
//行求和函数定义
void sum_row(int(*arr)[4], int raw, int* sum) {
int i = 0;
*sum = 0;
for (; i < 4; i++) {
*sum += (*(*(arr + raw-1) + i));
}
}
//列求和函数定义
void sum_col(int(*arr)[4], int col, int* sum) {
int i = 0;
*sum = 0;
for (; i < 3; i++) {
*sum += (*(*(arr +i ) + (col-1)));
}
}
int main() {
int matrix[3][4];
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
matrix[i][j] = i * 4 + j;
}
}
printf("输出初始矩阵:\n");
int(*p)[4];//定义数组指针p
p = matrix;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
printf("%-5d", *(*(p + i) + j));
}
printf("\n");
}
int sum;
void (*q)(int(*arr)[4], int raw, int* sum);//定义函数指针
printf("计算第一行的和:\n");
q = sum_row;
(*q)(matrix, 1, &sum);//调用行求和函数
printf("sum=%d\n",sum);
printf("计算第一列的和:\n");
q = sum_col;
(*q)(matrix, 1, &sum);//调用列求和函数
printf("sum=%d\n", sum);
}
运行结果: