#include int inc(int a) { return(++a); } int multi(int*a,int*b,int*c) { return(*c=*a**b); }

本文通过一个具体的C语言示例,深入解析了函数指针的定义与使用方法,并探讨了函数名与函数指针之间的区别。同时,还介绍了如何正确地在函数中传递和调用另一个函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天做到一题面试题如下, 读到第9行的时候发现和自己理解的有出入。

个人理解函数名是函数的入口地址就是一个人指针,那为什么还要取地址再赋值给p呢?

带着疑惑百度了一番,发现网上没人发现程序中的问题,所以就记录一下,希望以后做到这题的同学不再被误解。

错误

//代码为网上复制的,存在许多问题
//运行的结果提示: 程序中有游离的‘\343’等一系列错误
#include <stdio.h>   
int inc(int a)   
{ return(++a); }   
int multi(int*a,int*b,int*c)   
{   return(*c=*a**b); }  
typedef int(FUNC1)(int in);   
typedef int(FUNC2) (int*,int*,int*);  
void show(FUNC2 fun,int arg1, int*arg2)  
{    
  FUNC1 p=&inc;   
  int temp =p(arg1);   
  fun(&temp,&arg1, arg2);   
  printf("%dn",*arg2);   
}   
main()   
{   
 int a;          
 show(multi,10,&a);    
 return 0;
}  

于是自己手打了一遍:

#include <stdio.h>

int inc(int a)
{
    return (++a);
}

int multi(int * a, int * b, int *c)
{
    return (*c = *a * *b);
}

typedef int(FUNC1)(int in);
typedef int(FUNC2)(int *,int *,int *);

void show(FUNC2 fun,int arg1,int * arg2)
{
    FUNC1 p = &inc;
    int temp = p(arg1);
    fun(&temp,&arg1,arg2);
    printf("%d\n",*arg2);
}
int main()
{
    int a;
    show(multi,10,&a);
    return 0;
}
//编译结果错误为:
//test.c: 在函数 ‘show’ 中:
//test.c:26: 错误:函数 ‘p’ 像变量一样被初始化

分析:

FUNC1 p = &inc;
左: 定义一个形参为int型,返回值为int型的函数p(p为函数的入口地址)。
右: 将函数inc()的入口地址 取 地址;
左右明显是不同的数据类型。

修改

//方法一:
#include <stdio.h>

int inc(int a)
{
    return (++a);
}

int multi(int * a, int * b, int *c)
{
    return (*c = *a * *b);
}

typedef int(*FUNC1)(int in);    //此时FUNC1变成了指向函数的指针
typedef int(FUNC2)(int *,int *,int *);

void show(FUNC2 fun,int arg1,int * arg2)
{
    FUNC1 p = &inc;  
//  FUNC1 p = inc;  这样写也是对的,不知道如何理解。
//  个人理解: 像int a[10]一样 ,  a和&a 是一个地址     
    int temp = p(arg1);
    fun(&temp,&arg1,arg2);
    printf("%d\n",*arg2);
}
int main()
{
    int a;
    show(multi,10,&a);
    return 0;
}
//方法二:
#include <stdio.h>

int inc(int a)
{
    return (++a);
}

int multi(int * a, int * b, int *c)
{
    return (*c = *a * *b);
}

typedef int(FUNC1)(int in);    
typedef int(FUNC2)(int *,int *,int *);

void show(FUNC2 fun,int arg1,int * arg2)
{
    FUNC1 *p = &inc;     //定义一个指针p指向一个形参为int型,返回值为int型的函数 
    int temp = p(arg1);
    fun(&temp,&arg1,arg2);
    printf("%d\n",*arg2);
}
int main()
{
    int a;
    show(multi,10,&a);
    return 0;
}

问题

//为什么在typedef int(FUNC2)(int *,int *,int *);的FUNC前加*程序也是对的
//请看到这篇文章的同学,帮我一下,谢谢。
//如下:
#include <stdio.h>

int inc(int a)
{
    return (++a);
}

int multi(int * a, int * b, int *c)
{
    return (*c = *a * *b);
}

typedef int(FUNC1)(int in);    
typedef int(*FUNC2)(int *,int *,int *);

void show(FUNC2 fun,int arg1,int * arg2)
{
    FUNC1 *p = &inc;     //定义一个指针p指向一个形参为int型,返回值为int型的函数 
    int temp = p(arg1);
    fun(&temp,&arg1,arg2);
    printf("%d\n",*arg2);
}
int main()
{
    int a;
    show(multi,10,&a);
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值