精华内容
下载资源
问答
  • 本文主要介绍 C语言函数指针的知识,这里整理了详细的资料及示例代码以便大家学习参考,有需要学习此部分知识的朋友可以参考下
  • C语言 函数指针和指针函数及Main()函数

    万次阅读 多人点赞 2018-09-04 10:59:01
    指针函数,简单的来说,就是一个返回指针函数,其本质是一个函数,而该函数的返回值是一个指针。 声明格式为:类型标识符 *函数名(参数表) 这似乎并不难理解,再进一步描述一下。 看看下面这个函数声明: int ...

    正文
    先来看看两者的定义以及说明。

    指针函数
    定义
    指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
    声明格式为:类型标识符 *函数名(参数表)

    这似乎并不难理解,再进一步描述一下。
    看看下面这个函数声明:

    int fun(int x,int y);
    

    这种函数应该都很熟悉,其实就是一个函数,然后返回值是一个 int 类型,是一个数值。
    接着看下面这个函数声明:

    int *fun(int x,int y);
    

    这和上面那个函数唯一的区别就是在函数名前面多了一个*号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。

    这样描述应该很容易理解了,所谓的指针函数也没什么特别的,和普通函数对比不过就是其返回了一个指针(即地址值)而已。
    指针函数的写法:
    int *fun(int x,int y);
    int * fun(int x,int y);
    int* fun(int x,int y);
    这个写法看个人习惯,其实如果*靠近返回值类型的话可能更容易理解其定义。

    示例
    (由于本人习惯于 Qt 中进行开发,所以这里为了方便,示例是在 Qt 工程中写的,其语法是一样的,只是输出方式不同)
    来看一个非常简单的示例:

    typedef struct _Data{
          int a;
          int b;
        }Data;
    

    //指针函数

        Data* f(int a,int b){
        Data * data = new Data;
        data->a = a;
        data->b = b;
        return data;
    }
    

    函数指针
    定义
    函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
    声明格式:类型说明符 (*函数名) (参数)
    如下:

    int (*fun)(int x,int y);
    

    函数指针是需要把一个函数的地址赋值给它,有两种写法:
    fun = &Function;
    fun = Function;

    取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
    调用函数指针的方式也有两种:

    x = (*fun)();
    x = fun();
    

    两种方式均可,其中第二种看上去和普通的函数调用没啥区别,如果可以的话,建议使用第一种,因为可以清楚的指明这是通过指针的方式来调用函数。当然,也要看个人习惯,如果理解其定义,随便怎么用都行啦。

    示例

    int add(int x,int y){
    return x+y;
    }
    int sub(int x,int y){
    return x-y;
    }
    

    //函数指针

    int (*fun)(int x,int y);
    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    //第一种写法
    fun = add;
    qDebug() << "(*fun)(1,2) = " << (*fun)(1,2) ;
    //第二种写法
    fun = &sub;
    qDebug() << "(*fun)(5,2) = " << (*fun)(5,3)  << fun(5,3);
    
    return a.exec();
    }
    

    输出如下:

    (*fun)(1,2) =  3
    (*fun)(5,2) =  2 2
    

    上面说到的几种赋值和调用方式我都分别使用了,其输出结果是一样的。

    二者区别
    通过以上的介绍,应该都能清楚的理解其二者的定义。那么简单的总结下二者的区别:

    定义不同
    指针函数本质是一个函数,其返回值为指针。
    函数指针本质是一个指针,其指向一个函数。

    写法不同
    指针函数:int* fun(int x,int y);
    函数指针:int (*fun)(int x,int y);
    可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。
    再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。

    Main()函数俩个参数
    1、定义
    C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为: main (argc,argv)C语言还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组。加上形参说明后,main函数的函数头应写为:
    int main (int argc,char *argv[]){…}或者
    int main (int argc,char **argv){…}
    其中第一个表示参数的个数;第二个参数中argv[0]为自身运行目录路径和程序名,argv[1]指向第一个参数、argv[2]指向第二个参数……
    完整程序如下
    这里写图片描述
    2、如何执行
    由于main函数不能被其它函数调用, 因此不可能在程序内部取得实际值。那么,在何处把实参值赋予main函数的形参呢? 实际上,main函数的参数值是从操作系统命令行上获得的。当我们要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传 送到main的形参中去,具体操作如下:
    首先在C++中完成编译之后,然后在dos命令窗口下切换到.exe执行文件所在的文件夹(dos下如何切换目录见DOS中切换盘符及目录),再在该路径下输入带参数的命令:XXX.exe a b c …即可得到输出。

    3、练习题
    不合法的main函数命令行参数表示形式是
    (A) main(int a,char *c[]) (B) main(int arc,char **arv)
    (C) main(int argc,char *argv) (D) main(int argv,char *argc[])

    **分析:**main的第2个参数应该为一个字符数组指针,B的第二个参数是一个指向字符的指针的指针,也就是一个字符串数组;
    C的第二个参数是一个指向字符的指针,也就是一个字符串.
    char **argv或者char *argv[]是个二维数组,也可以理解为一个存放字符指针的数组—字符指针数组。每个元素存放一个字符指针,而字符指针又是可以指向一个字符串的,这n个字符串分别由argv[0]~~~argv[n]来指向.
    这个就是指针数组,不是别的,特别不是二维数组。
    综述,答案为C。

    展开全文
  • 前述:C语言的奥秘,博大精深,今天来回忆的分析函数指针函数指针数组的用法。具体请见下面一个注册程序的实现。 1 #include &lt;stdio.h&gt; 2 #include &lt;string.h&gt; 3 5 6 typedef ...

    前述:C语言的奥秘,博大精深,今天来回忆的分析函数指针,函数指针数组的用法。具体请见下面一个注册程序的实现。    

      1 #include <stdio.h>
      2 #include <string.h>
      3   
      5 
      6 typedef void (*poniter_fun)(int);   //定义一个函数指针
      7 
      8 typedef struct poniter_desc {
      9         char *name;
     10         poniter_fun fp;
     11 } poniter_desc,*p_poniter_desc;
     12 
     13 poniter_desc poniter_array[10];    
     14 p_poniter_desc  p_poniter_array;
     15 
     16 int register_fun(char *name,poniter_fun fp)   //注册函数
     17 {
     18         int i;
     19         for(i=0;i<10;i++)
     20         {
     21                 if(!poniter_array[i].fp)
     22                         {
     23                                 poniter_array[i].name=name; poniter_array[i].fp=fp;
     25                                 return 0;
     26                         }
     27         }
     28         return -1;
     29 }
     30 int unregister_fun(char *name,poniter_fun fp)    //注销函数
     31 {
     32         int i;
     33         for(i=0;i<10;i++)
     34         {
     35                 if(!strcmp(poniter_array[i].name,name))
     36                         {
     37                                 poniter_array[i].name=NULL;
     38                                 poniter_array[i].fp=NULL;
     39                                 return 0;
     40                         }
     41         } return -1;
     43 }
     44 void run(void)     //调用
     45 {
     46         poniter_array[0].fp(1);
     47         poniter_array[1].fp(2);
     48 }
     49 
     50 void first(int i)
     51 {
     52         printf("this is first fun%d \r\n",i);
     53 }
     54 
     55 void second(int i)
     56 {
     57         printf("this is second fun%d \r\n",i);
     58 }
     59 
     60 
     61 
     62 void main()
     63 {
    
     65   register_fun("first",first);   //将函数加入注册函数
     66   register_fun("second",second);
     67   run();
     68 }
    
    
    
    

    下面为函数相应的输出结果

    book@www.100ask.org:~/myFile/fun_ponit$ ls
    register  register.c
    book@www.100ask.org:~/myFile/fun_ponit$ ./register 
    this is first fun 1 
    this is second fun 2 

    展开全文
  • C语言函数指针与NULL

    2019-10-20 13:36:13
    C语言中,函数指针和普通指针类似,如果定义了一个函数指针,比如int (*fun)(int a,int b); 那么函数指针fun将默认初始化为NULL。 注意: 1)函数指针不是函数声明,不要混淆。 2)C中函数名可以隐式转换为函数...

    C语言中,函数指针和普通指针类似,如果定义了一个函数指针,比如int (*fun)(int a,int b); 那么函数指针fun将默认初始化为NULL。

    注意:

    1)函数指针不是函数声明,不要混淆。

    2)C中函数名可以隐式转换为函数指针,但是C++中非静态成员函数无法隐式转换,

          因此在C/C++中获取函数指针时最好统一用取地址符&:即函数指针 = &函数名。

    比如定义一个函数指针fun:

    #include <stdio.h>
    
    int (*fun)(int a,int b); //定义函数指针
    
    main()
    {
        printf("fun=%p\r\n", fun);
    }
    

    编译  gcc test_fun.c -o test_fun

    运行./test_fun, 输出:fun=(nil) 即空指针。

     

    如果函数指针是通过extern引入的,比如 test.h 声明了一个函数指针:

    extern int (*fp)(int,int);
    

    那么必须在某个.c里面有其定义,否则在其他.c中调用fp指针会在链接时找不到定义。

    比如将其定义在test_lib.c:

    #include "test.h"
    
    int (*fp)(int,int); //函数指针定义
    
    void init_fun(int (*fp_p)(int,int))
    {
        fp = fp_p;
    }
    

    那么在其他.c文件中可以访问这个函数指针,比如test.c:

    #include "test.h"
    
    #include <stdio.h>
    
    int test_fun(int a,int b)
    {
        return 0;
    }
    
    int test_fun2(int a,int b)
    {
        return 0;
    }
    
    main()
    {
        printf("fp=%p\r\n", fp);
    
        printf("test_fun ptr=%p\r\n", test_fun);  //函数名隐式转换为函数指针
        printf("test_fun ptr=%p\r\n", &test_fun); //函数名取地址获取函数指针
        printf("test_fun2 ptr=%p\r\n", &test_fun2);
    
        fp = test_fun;
        printf("fp=%p\r\n", fp);          //函数指针
        printf("fp ptr=%p\r\n", &fp);     //函数指针的指针
    
        init_fun(&test_fun2);
    
        printf("fp=%p\r\n", fp);
    
    }
    

    编译gcc test.c test_lib.c -o test

    运行./test 输出:
    fp=(nil)
    test_fun ptr=0x400538
    test_fun ptr=0x400538
    test_fun2 ptr=0x400549
    fp=0x400538
    fp ptr=0x600a70
    fp=0x400549

     

    如果test_lib.c 中把int (*fp)(int,int); 这行注释掉,会报错:

    [me@vm009190 test]$ gcc test.c test_lib.c -o test
    /tmp/ccwI8oyG.o: In function `main':
    test.c:(.text+0x29): undefined reference to `fp'
    test.c:(.text+0x6a): undefined reference to `fp'
    test.c:(.text+0x75): undefined reference to `fp'
    test.c:(.text+0x9d): undefined reference to `fp'
    /tmp/ccdAmTQX.o: In function `init_fun':
    test_lib.c:(.text+0xf): undefined reference to `fp'
    collect2: error: ld returned 1 exit status

     

     

    展开全文
  • C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include #include char *strlong(char *str1, char *str2){...
  • C语言函数指针与回调用函数

    万次阅读 2018-05-22 01:48:23
    1. 函数指针 指针是c语言的精髓,同时也是c语言中比较深奥、比较难掌握的一个知识点。本质上,对于一个内存单元来说,单元的地址即为指针, 其中存放的数据才是该单元的内容。我们允许用一个变量来存放指针,这种...

    1. 函数指针
    指针是c语言的精髓,同时也是c语言中比较深奥、比较难掌握的一个知识点。本质上,对于一个内存单元来说,单元的地址即为指针, 其中存放的数据才是该单元的内容。我们允许用一个变量来存放指针,这种变量称为指针变量。因此, 一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。下面定义了几种不同类型的指针变量。

    char *pTr = NULL;
    int *pT = NULL;
    double *pDou = NULL;
    

    其中:pTr是指向 char 型类型的指针变量;pT是指向 int 类型的指针变量;pDou 是指向double 类型的指针变量。指针变量是由普通类型派生出来的一种类型,其中变量前面的 * 号用于表明该数据类型是指针类型。

    1.1 何为函数指针?
    在c语言中有4个概念是值得弄清楚的,分别是:函数指针、指针函数、数组指针和指针数组。
    我这里简单的对这4个概念做一下说明:

    展开全文
  • 主要介绍了详解C语言结构体中的函数指针,文中对函数指针的基本概念也有讲解,需要的朋友可以参考下
  • c语言函数指针和指针函数.pdf
  • 学习c语言函数指针和指针函数.pdf
  • c语言函数指针的多种赋值方法

    千次阅读 2019-07-25 15:24:10
    c语言函数指针的多种赋值方法 提供框架模型,具体代码缩略,适合功能模块包装,例子程序为c语言基于TCP的图片发送 1、mdu_TcpClient.h中: 定义结构体 typedef struct { int (*init)(char *szIpaddr, char *...
  • c语言函数指针和指针函数[收集].pdf
  • 主要介绍了深入学习C语言中的函数指针和左右法则,左右法则是一种常用的C指针声明,需要的朋友可以参考下
  • c代码-C语言 函数指针

    2021-07-16 12:13:11
    c代码-C语言 函数指针
  • 详解C语言指针函数、函数指针函数指针数组

    万次阅读 多人点赞 2018-07-09 11:08:24
    而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。 1. 指针函数 指针函数就是返回指针值...
  • C语言函数指针和函数的首地址

    千次阅读 2019-06-05 11:38:56
    一个函数在编译之后,会占据一部分内存,而它的函数名,就是这段函数的首地址。看如下代码 // // Created by lwl on 2019/6/2. // #include <string.h> #include <stdlib.h> #include <stdio.h> ...
  • C语言函数指针[文].pdf

    2021-10-11 01:38:48
    C语言函数指针[文].pdf
  • C语言函数指针

    2013-07-14 23:23:43
    比较详细透彻的讲述了C语言函数指针的基本知识点,以及基础的应用,让读者更容易学习和理解.
  • C语言函数指针调用函数

    千次阅读 2015-07-01 21:26:18
    1、定义函数指针变量: 函数返回值类型 (*指针变量名)(); 2、将已有函数入口赋值给函数指针变量:fnPt = avg; 3、使用指针变量调用函数:(*指针变量名)(参数); 例子:定义函数指针变量,将不同函数赋值给指针变量...
  • c语言函数指针_指针函数_返回值是函数指针

    千次阅读 多人点赞 2019-03-06 17:38:43
    函数指针作为函数的返回值 1.指针函数的定义 顾名思义,指针函数即返回指针的函数。其一般定义形式如下: 类型名 *函数名(函数参数表列); 其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”...
  • C语言函数指针的三种使用方法总结 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正。写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能...
  • C语言函数指针的使用举例

    千次阅读 2016-01-19 14:40:45
    可以在process函数中,使用函数指针作为参数,传递不同函数的入口地址,得出不同的结果。 函数指针的定义为:int (*p)(int,int) 使用为:(*p)(a,b); 源码例子: int add(int a,int b) { return
  • c语言指针回调函数最全demo实例(简单明了一看就会)
  • C语言函数指针变量

    千次阅读 2013-12-06 14:56:33
    C语言中,一个函数总是占用一段...我们把这种指向函数的指针变量称为“函数指针变量”。 函数指针变量定义的一般形式为:  类型说明符 (*指针变量名)(); 其中“类型说明符”表示被指函数的返回值的类型。“
  • C语言函数指针参数也是传值调用

    千次阅读 2012-07-09 23:18:35
    先看看下面一段代码: #include #include void F(int *pi) {  pi = (int *)malloc(sizeof(int)); } main() {  int *pi = NULL;  F(pi);...如果你指望函数F能帮你改变pi的值,那你就错了
  • c语言函数指针的定义和使用

    千次阅读 2020-02-12 17:37:35
    1、定义:函数返回值类型 (* 指针变量名) (函数参数列表);...另外,还可以使用typedef来定义函数指针 例如: typedef void (*func) (void); //将函数指针 void (*) (void) 重命名为func。 void (*myfunc) (...
  • 函数指针在赋值以后,例如通过库动态加载方式,然后在使用时,程序调用遇到了既加星号,也有不加星号的方式,因此有点疑惑。 先上实例,再作分析 #include &lt;stdio.h&gt; void myfun(void); int main...
  • Linux C 函数指针应用---回调函数 https://blog.csdn.net/zqixiao_09/article/details/50373567 钩子函数 https://blog.csdn.net/sunstars2009918/article/details/39340449 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 281,071
精华内容 112,428
关键字:

c语言函数指针

c语言 订阅