c语言之函数指针的一系列测试

1.先从一个简单的求和求积函数开始

#include <stdio.h>

int add(int a , int b)
{
    return a + b;
}

int mul(int a , int b)
{
    return a * b;
}

int main()
{
    int a_count = add(5,7);
    int m_count = mul(5,7);
    printf("a_count is %d\n",a_count);
    printf("m_count is %d\n",m_count);

    return 0;
}

输出:

a_count is 12

m_count is 35

Program ended with exit code: 0

2.试一下函数指针

#include <stdio.h>

int add(int a , int b)
{
    return a + b;
}
int mul(int a , int b)
{
    return a * b;
}

int main()
{
    int (*p_add)(int,int);//声明函数指针
    p_add = add;
    int (*p_mul)(int,int);
    p_mul = mul;

    int a_count = p_add(5,7);
    int m_count = p_mul(5,7);
    printf("a_count is %d\n",a_count);
    printf("m_count is %d\n",m_count);

    return 0;
}

结果不变

a_count is 12

m_count is 35

Program ended with exit code: 0

3.简化一下函数指针的定义

#include <stdio.h>

int add(int a , int b)
{
    return a + b;
}
int mul(int a , int b)
{
    return a * b;
}

int main()
{
    typedef int (*fun)(int,int);//定义类型fun是一个指向函数的指针
    fun p_add = add;
    fun p_mul = mul;

    int a_count = p_add(5,7);
    int m_count = p_mul(5,7);
    printf("a_count is %d\n",a_count);
    printf("m_count is %d\n",m_count);

    return 0;
}

结果不变

a_count is 12

m_count is 35

Program ended with exit code: 0

4.尝试使用一下函数指针数组

#include <stdio.h>

int add(int a , int b)
{
    return a + b;
}
int mul(int a , int b)
{
    return a * b;
}

int main()
{
    int (*func[])(int,int) = {add,mul};//定义函数指针数组

    int a_count = func[0](5,7);
    int m_count = func[1](5,7);
    printf("a_count is %d\n",a_count);
    printf("m_count is %d\n",m_count);

    return 0;
}

结果不变

a_count is 12

m_count is 35

Program ended with exit code: 0

5.改善函数指针数组

毕竟,函数多了之后,谁能记住乘法是在数组里第几个,下标该是多少。

#include <stdio.h>

int add(int a , int b)
{
    return a + b;
}
int mul(int a , int b)
{
    return a * b;
}

int main()
{
    int (*func[])(int,int) = {add,mul};//定义函数指针数组
    enum func_tpye{ ADD , MUL };  //顺序与上面保持一致

    int a_count = func[ADD](5,7);
    int m_count = func[MUL](5,7);

    printf("a_count is %d\n",a_count);
    printf("m_count is %d\n",m_count);

    return 0;
}

结果不变

a_count is 12

m_count is 35

Program ended with exit code: 0

6.在函数中调不同的函数

之前的例子,直接用函数会更好用一些

#include <stdio.h>
typedef  int (*fun)(int,int);

int add(int a , int b)
{
    return a + b;
}
int mul(int a , int b)
{
    return a * b;
}
int add_mul(fun f,int a,int b)
{
    return f(a,b);
}

int main()
{
    int (*func[])(int,int) = {add,mul};//定义函数指针数组
    enum func_tpye{ ADD , MUL };  //顺序与上面保持一致

    printf("a_count is %d\n",add_mul(func[ADD], 5, 7));
    printf("m_count is %d\n",add_mul(func[MUL], 5, 7));
    return 0;
}

结果不变

a_count is 12

m_count is 35

Program ended with exit code: 0

7.上面那个例子还可以再扩展的更强大一些

比如说把两个数相乘相加改为多个数相乘相加

#include <stdio.h>
#include <stdarg.h>
typedef  int (*fun)(int,int);

int add(int a , int b)
{
    return a + b;
}
int mul(int a , int b)
{
    return a * b;
}
int add_mul(fun f,int n,...)
{
    va_list ap;
    va_start(ap,n);
    int count = va_arg(ap, int);
    for (int i = 0; i<(n-1); ++i) {
        count = f(count,va_arg(ap, int));
    }
    return count;
}

int main()
{
    int (*func[])(int,int) = {add,mul};//定义函数指针数组
    enum func_tpye{ ADD , MUL };  //顺序与上面保持一致

    printf("a_count is %d\n",add_mul(func[ADD], 5,1,2,3,4,5));
    printf("a_count is %d\n",add_mul(func[ADD], 3,7,3,6));

    printf("m_count is %d\n",add_mul(func[MUL], 5,1,2,3,4,5));
    printf("m_count is %d\n",add_mul(func[MUL], 3,7,3,6));
    return 0;
}

第一个参数为功能函数,第二个参数为运算的个数,之后是不定参数。

结果为:

a_count is 15

a_count is 16

m_count is 120

m_count is 126

Program ended with exit code: 0

时间: 2024-10-11 03:44:38

c语言之函数指针的一系列测试的相关文章

可读性很强的C语言的函数指针定义

通常C/C++程序里面要用到大量的指针,其语法非常难以阅读.比如下面的vp指针类型: #include <iostream> using namespace std; typedef void (*vp) (float&,float&); void foo(float &a,float &b) { a = a + b; } int main() { // float a=1; float b=2; vp t=&foo; t(a,b); cout <

C语言中函数指针数组浅析

发现问题 问题分析 示例代码 发现问题 今天,在阅读Linux内核中关于socket的源代码时,遇到了下面一段代码: struct proto_ops { int family; struct module *owner; int (*release) (struct socket *sock); int (*bind) (struct socket *sock, struct sockaddr *myaddr, int sockaddr_len); int (*connect) (struct

【C语言】函数指针与回调函数

在C语言中:指针是C语言的特色,有着各种各样的指针,普通的变量指针,常量指针,数组指针,指针数组,函数指针,指针函数.我们就讲一下函数指针与回调函数吧 首先关于函数指针,其实很简单. 对于一个函数指针来说,顾名思义,就是一个指向函数的指针,需要知道的是,对于指针而言,他总是存储一块地址,地址里面有着一个,一组,或者一块数据,在函数中,函数的存储是放在代码段的,每个函数都有着一个函数首地址,调用了这个地址相当于调用的这个函数. 具体的可以观看我的这篇博客,其中就通过在内存阶段改变栈帧返回值,成功的

C语言的函数指针数组(好绕啊~)

int *(*p(int))[3] 今天有人问这个是啥?我一看直接就懵逼了…… 下面做一些简单的分析. int p; //这是整数型变量p int *p; //这是整数型指针p int *p[3]; //这是长度为3的整数型指针数组p,元素为整数型指针 int (*p)[3]; //这是一个数组指针,指向一个长度为3的整数型数组 int p(int); //这是函数声明,形参:整数型 ,返回值:整数型 等同于 int p(int x); int *p(int); //这是函数声明,形参:整数型

C语言中函数指针

函数调用的方法有两种分别如下: void Fun(void) { //do something } int main(void) { ... Fun(); ... return 0; } void Fun(void) { //do something } int main(void) { ... void (*p)(void); p=Fun; p(); return 0; } 上面两种方式都可以调用函数,第二种方式在回调函数中用的最多,尤其是在操作系统的任务切换中.那么我们就重点来分析下第二种方

C语言之函数指针用法总结

一.函数返回指针值 函数是实现特定功能的程序代码的集合,函数代码在内存中也要占据一段存储空间 (代码区内),这段存储空间的起始地址称为函数入口地址.C语言规定函数入口地址为函数的指针,即函数名既代表函数,又是函数的指针(或地址). 1.函数的返回类型可以是指针类型,即函数返回指针值,其定义形式为: 2.函数返回指针值,需要考虑指针有效性的问题,例如:  这个返回有问题,因为它返回的是函数局部变量a的地址值.当函数调用结束后,函数局部变量会释放,变成未知对象.在return语句时,&a还是有效的,

c语言定义函数指针和typedef简写

二种方法来定义函数指针 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<Windows.h> 4 5 int add(int a, int b) 6 { 7 return a + b; 8 } 9 10 //void msg(char s[]) 11 //void (*p)(char s[]) 函数指针的定义方法 12 //void (*)(char *s) 函数指针的类型 13 14 void msg(char

【C语言】 函数指针小谈

指针可以指向变量.数组,也可以指向函数,函数指针就是指向函数的指针 函数名实际是程序在内存中的起始地址.而指向函数的指针可以把地址传递给函数 也可以从函数返回给指向函数的指针.例如这个例子:通过一个函数求两个数的和 并通过函数指针调用该函数. #include<stdio.h> int sum(int a,int b);//求和函数的声明 void main() { int a,b; int (*fun)(int,int);//声明一个函数指针 printf("请输入两个整数:&qu

c语言中函数指针和指针函数

一.什么是函数指针: 函数指针本质上也是指针,我们所写函数代码在内存中会被分配一段专门的储存空间,这段储存空间的地址就是函数的地址,既然是地址,就可以用指针去表示,自然就有了函数指针. 二.函数指针的用法: 1.首先明确函数指针怎么申明.形如:返回值类型 (*变量名)(参数类型1,参数类型2,...) 例如 int (*p) (int,int) 2.我们还需要了解如何通过指针调用函数. (*p)(3,5); 3.如何给该类型的指针赋值: 非常简单,直接将函数名赋给指针即可,因为函数名即为函数的首