您的位置:首页 > 编程语言 > C语言/C++

C语言学习—函数指针

2015-10-20 00:00 381 查看
摘要: 函数指针定义,函数回调,动态排序,函数返回值是函数指针

一.函数指针定义

函数地址:函数名和数组名一样是地址.

int maxValue(int a, int b)
{
return a > b ? a : b;
}
//maxValue是函数名,即是函数地址

函数指针定义

int maxValue(int a, int b)
int (*p)(int ,int ) = NULL;
//函数指针定义,p是变量,其它是类型

函数指针使用

p = maxValue;//赋值函数名
int m = p(3, 5);//指针可以当函数用

二.回调函数

函数指针做参数

int getValue(int a, int b, int (*p)(int , int));
//getValue是函数名,函数指针做getValue函数的参数

函数调用

int value = getValue(3, 5, maxValue)
//getValue执行过程中在调用(回调) maxValue

三.动态排序

排序

void sortArray(int * arr, int count){
for(int i = 0; i < count - 1; i ++){
for(int j = 0;j < count - i - 1; j ++){
if(条件) {
交换;
}
}
}
//注意:决定排序方式的重要语句封装成函数后在此回调

int 数组动态排序

typedef BOOL (*PFUN) (int , int);
//为函数指针类型起别名为PFUN

void sortArray(int *arr, int count, PFUN p);
//动态排序函数声明

四.函数返回值是函数指针

返回值为函数指针

PFUN getFunctionByName(char * name);
//通过功能名称查找对应的函数

数据结构

typedef struct nameFunctionPair
{
char name[30];
PFUN function;
}NameFunctionPair;

查找对应函数

PFUN fun = NULL;
fun = getFunctionByName("min");

调用返回的函数

int value = fun(3, 5);
//使用返回的函数指针调用函数,完成动态调用

五.练习代码

#include<stdio.h>
void printfArray(int *arr, int count)
{
for (int i = 0; i < count; i ++) {
printf("%2d ", arr[i]);
}
printf("\n");
}
//    1.(***)随机生成一个10个元素的数组,找到3的倍数,并将其值修改成0.(注意:修改数值使用回掉函数处理)
void changeValue(int *value)
{
if (0 == *value % 3) {
*value = 0;
}
}
void getValue(int *arr, int count, void (*p)(int *))
{
for (int i = 0; i < count; i ++) {
p(arr + i);
}
}
//    2. (***)有两个10个元素的数组,分别为A和B,编程实现相同位置的元素,
//    如果B的元素小于A的元素进行数值交换:(使用回调函数实现)
void changeV(int *number1, int *number2)
{
if (*number1 < *number2) {
int temp = *number1;
*number1 = *number2;
*number2 = temp;
}
}

void changeArrayElementValue(int *arr1, int *arr2, int count, void (*p)(int *, int *))
{
for (int i = 0; i < count; i ++) {
p(arr1 + i, arr2 + i);
}
}

int main(int argc, const char * argv[]) {
//题1
int arr[10] = {0};
for (int i = 0; i < 10; i ++) {
arr[i] = arc4random() % 20 + 1;
}
printfArray(arr, 10);

getValue(arr, 10, changeValue);

printfArray(arr, 10);

//题2
int myarr1[10] = {0};
int myarr2[10] = {0};
for (int i = 0; i < 10; i ++) {
myarr1[i] = arc4random() % 90 + 1;
myarr2[i] = arc4random() % 90 + 1;
}
printf("\n");
printfArray(myarr1, 10);
printfArray(myarr2, 10);
printf("\n");
changeArrayElementValue(myarr1, myarr2, 10, changeV);
printfArray(myarr1, 10);
printfArray(myarr2, 10);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息