精华内容
下载资源
问答
  • 函数指针声明、赋值、调用

    千次阅读 2019-03-14 10:58:18
    一、函数指针声明 1、返回值类型 ( *指针变量名) ([形参列表]); ( *指针变量名) 函数指针声明时...二、函数指针赋值 以下两种对函数指针的赋值哪个是正确的? int function(int a, int b) { //执行代码 } ...

    一、函数指针声明

    1、返回值类型 ( * 指针变量名) ([形参列表]);

    ( * 指针变量名)   函数指针声明时括号不能省略,否则改变了运算符的优先级,变成了返回一个指针的函数

    ([形参列表])函数括号中的形参可有可无,视情况而定;

    二、函数指针赋值

    以下两种对函数指针的赋值哪个是正确的?
     

    int function(int a, int b)
    {
        //执行代码
    }
    
    int main(void)
    {
        int (*FP)(int, int) = function;
        int (*FP)(int, int) = &function;
    }

    网上说法:两个都是可以的。函数名是一个地址,可以将他赋值给一个指向函数的指针。前面加了&符号其意义是一样的。比如定义一个数组arr[],arr表示这个数组的首地址,但&arr同样表示他的首地址。这些都是设计语言时这样规定的

    确实两个都可以,但是网上其实说得不全对,特别是加了删除线的那一句,C/C++里面的数组名字会退化为指针,所以数组名a实际指的是数组的第一个元素的地址。而数组名作为指针来讲有特殊性,它正在它所指向的内存区域中,&a的值和a的数值是相同的,但是类型和意义不同。而指针的加法操作和指向的数据类型密切相关。

    int a[10]; a就相当于int *,如果是对它加1(a + 1)是相当于a + 1 * sizeof(int)。但是&a的类型则相当于int **,是所谓指向数组的指针,是数组元素类型的二级指针,对它加1是相当于 &a + 1 * sizeof(a)的,所以会偏移一个数组长度。

    二、函数指针调用


    下面对函数指针的调用哪种是正确的,还是都正确?

     

     

    int function(int a, int b)
    {
        //执行代码
    }
    
    int main(void)
    {
        int (*FP)(int, int);
        FP= function;    //第一种赋值方法
       // FP = &function;   //第二种赋值方法
        FP(1,2);       //第一种调用方法
       // (*FP)(1,2);  //第二种调用方法
    
    }
    两个也都是可以的,同理

     

     

    展开全文
  • 再将函数赋给函数指针。但是我按照这个方式做了之后,发现报错了。请问各位这是什么 原因? ![我写的代码](https://img-ask.csdn.net/upload/201710/03/1507020709_237009.png) ![书上的代码]...
  • c语言函数指针的多种赋值方法

    千次阅读 2019-07-25 15:24:10
    c语言函数指针的多种赋值方法 提供框架模型,具体代码缩略,适合功能模块包装,例子程序为c语言基于TCP的图片发送 1、mdu_TcpClient.h中: 定义结构体 typedef struct { int (*init)(char *szIpaddr, char *...

     

     c语言函数指针用法【多种赋值方法】


    提供框架模型,具体代码缩略,适合功能模块包装,例子程序为c语言基于TCP的图片发送

    1、mdu_TcpClient.h中:


    定义结构体

    typedef struct
    {
          int  (*init)(char *szIpaddr, char *wTcpPort);                             //初始化tcp客户端
                                                                                    //发送数据
          int  (*sendData)(unsigned int ntskId, unsigned int nsize, long long ntimestamp, char *pStream);    
          void (*close)(void);
          
    }MDU_TCPCLIENT_ARG_T;

     

     2、mdu_TcpClient.c中:


    各个子函数的定义,具体内容缩略

    int initiation(char *szIpaddr, char *wTcpPort)
    {
         ...
    }
    int sendPack(unsigned int ntskId,unsigned int nsize, long long ntimestamp, char *pStream)
    {
         ...
    }
    void close_tcpclient(void)
    {
         ...
    }


    结构体函数指针赋值

    MDU_TCPCLIENT_ARG_T mdu_tcpclient_arg = {
               .init            = initiation,
               .sendData        = sendPack,
               .close           = close_tcpclient,
    };


    或者如下

    MDU_TCPCLIENT_ARG_T mdu_tcpclient_arg = {
                initiation,
                sendPack,
                close_tcpclient,
    };

    3、client_main.c中


    主函数调用

    int main(int argc, char *argv[])
    {
           ...
          //函数指针调用
          if(mdu_tcpclient_arg.sendData(12,1024,1230*1230, PicName)!=1)
          {
              ...
          }
           ...
      ...
    }

     

    END

     

    展开全文
  • 最近做一个banana Pi M1+的硬解码器封装成类的时候,由于是依赖ffmpeg的,而... 就开始封装吧,我就直接把用到的全局变量和函数分别放到定义的类中,然后整理完后,直接编译,喔,报错!!然后查看错误,提示指针...

    最近做一个banana Pi M1+的硬解码器封装成类的时候,由于是依赖ffmpeg的,而ffmpeg是C 实现的,本来demo 都是直接用C写的,测试也没有问题,想着封装也不会有问题,至少自己对C++类还是比较理解的(至少用于封装Android SDK还是很多次了)。

        就开始封装吧,我就直接把用到的全局变量和函数分别放到定义的类中,然后整理完后,直接编译,喔,报错!!然后查看错误,提示指针函数不符合,类型不对,类成员函数有个类,因为的确有行代码是把一个函数赋值给ffmpeg 结构体里面的函数指针(这也是ffmpeg的一种实现标准了),于是我就想着怎么赋值呢,怎么强制都不行,那就百度吧,果然有前辈,使用静态成员函数,“静态成员函数”:static 修饰,相当于在这个类作用域的全局函数,所以成员函数可以任意访问静态成员函数;于是在类中把要赋值给ffmpeg的函数定义成静态成员函数,编译报错!!因为刚刚定义的静态成员报错有个成员变量未定义,原来静态成员函数不能访问非静态成员变量,因为类的非静态成员都需要默认一个this指针才能访问的,想想也对,平时都是想new 一个对象 ,然后继续访问成员变量的。但是静态成员函数是全局的,定义时就有效,去访问一个无效的东西,的确会报错没有定义。

    怎么解决呢?把静态成员函数访问的成员变量,定义成静态的。但是编译还是会报错,为什么呢?因为在类里面的静态变量在类里面只是声明,并没有初始化定义,所以再在类外面初始化类的静态成员变量就好,终于解决了。

    希望我的说法没有错,这是我花了一个小时搞好的,开始太小看C++了。

    展开全文
  • 函数指针的定义,赋值以及使用

    千次阅读 2019-04-14 21:44:53
    函数指针的定义 函数类型(*指针变量名)(形参列表) ‘函数类型’说明函数的返货类型,由于‘()’的优先级高于‘星’,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数...

    1.函数指针定义

    函数类型 (*指针变量名)(形参列表);

    “函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

    例如:

    int (*f)(int x);

    double (*ptr)(double x);

    在定义函数指针时请注意:
     
     
    函数指针和它指向的函数的参数个数和类型都应该是—致的;

    函数指针的类型和函数的返回值类型也必须是一致的。

    2.函数指针的赋值

    函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。

    例如,

    int func(int x);

    int (*f) (int x);

    f=func;

    赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

    3.通过函数指针调用函数

    函数指针是通过函数名及有关参数进行调用的。

    与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则pf就等价于它所指的变量f。同样地,f是指向函数func(x)的指针,则f就代表它所指向的函数func。所以在执行了 f=func;之后,(*f)和func代表同一函数。

    由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步:

    首先,要说明函数指针变量。

    例如:int (*f)(int x);

    其次,要对函数指针变量赋值。

    例如: f=func;    (func(x)必须先要有定义)

    最后,要用 (*指针变量)(参数表);调用函数。

    例如:    (*f)(x);(x必须先赋值)

    展开全文
  • 函数指针赋值 回调函数

    千次阅读 2017-04-27 22:10:12
    问:先定义了个函数: int function(int a, int b) ...问题1:那么下面两种对函数指针赋值哪个是正确的,还是都可以? int main(void) { A: int (*FP)(int, int) = function; B: int (*FP)(int, int) =
  • 02. * 为结构体中的指针数组赋值 03. */ 04. 05.#include 06. 07.typedef struct test 08.{ 09. void (*p)(void); 10. void (*q)(void); 11. void (*y)(void); 12.}test; 13. 14.void f1
  • C++类 结构体成员 函数指针 赋值

    千次阅读 2016-02-07 15:30:07
    第一种方式传递变量myStr的函数指针为非静态函数,由于函数中隐含了this,所以函数能够根据this指针区分出不同的对象。 第二种方式的为静态函数,但是你显示的指定了this即void *pObj,使得静态函数仍然能够...
  • //利用二维指针。...c语言实现函数给主函数中的指针赋值的方法 */ #include void f (int **p); int main (){ int * a ; a = NULL ; f (&a); printf("%d",*a); free(a); } void f (int **a){
  • 函数指针赋值与调用

    万次阅读 2015-10-19 18:34:42
    问:先定义了个函数: int function(int a, int b) ...问题1:那么下面两种对函数指针赋值哪个是正确的,还是都可以? int main(void) { A: int (*FP)(int, int) = function; B: int (*FP)(int, int) =
  • #include <stdio.h> unsigned char *ptr = NULL; unsigned char num = 3; static void fun(unsigned char **mem) { *mem = &num; } int main() { fun(&... printf("%d \n"...
  • 指向函数的指针变量的一般定义...再给函数指针变量赋值时,只需出函数名而不必出参数 #include &lt;stdio.h&gt; double f1(double x) { return x*x; } double f2(double x, double y) { return x*y; ...
  • 函数C++指针变量赋值,分析了指针变量的特性,并追踪了给指针变量赋值的过程。
  • 函数指针赋值

    千次阅读 2012-10-22 21:11:30
    在远程注入的时候特别需要给函数指针赋值。   有以下2种方法, 第一定义方法。主要用于大量同参数的函数注入。   #include "stdafx.h" #include "windows.h" typedef int (_stdcall * p_MessageBoxA)...
  • 2、函数指针定义需要用到关键字typedef 例如:typedef int (*initOSFile_func_t)(void); 这个时候initOSFile_func_t就是指针类型了 3、直接调用地址例如跳转到0x31000000; ( (void (*)( ))0x31000000 ) ( ); ...
  • 第一种方法就是在定义指针的同时告诉指针指向的地址,第二中情况,不在定义指针的时候初始化,而是把地址直接赋值给指针变量。注意:不可以在指针不清楚指向地址的情况下给指针赋值(但是char p=0或者p=NULL除外,该...
  • C语言结构体指针赋值

    千次阅读 2021-05-21 07:53:44
    《C语言结构体指针赋值》由会员分享,可在线阅读,更多相关《C语言结构体指针赋值(6页珍藏版)》请在人人文库网上搜索。1、指向结构体的指针 在C语言中几乎可以创建指向任何类型的指针,包括用户自定义的类型。...
  • 第一个例子说明指向函数指针如何说明、赋值、调用。  #include  #define TESTDATE 100  int func(int a) /* func用于打印一个整数 */  {   return printf("%d\n",a);  }  main()  { ...
  • 通过函数给指针赋值(一)

    千次阅读 2014-07-31 06:19:10
    1、通过函数给某个已经声明并且初始化了的指针变量赋值,涉及到许多关键点,下面通过一些示例来说面。 2、函数要传值,基本上有两种方法:一种是通过指定函数类型,用return返回相应的值;另一种就是...
  • 结构体是 C 语言中一个...但是在 C 语言的结构体成员却不能是函数,针对这一问题,本文分析探讨了将函数指针作为结构体成员的理论和方法。通过在结构体中定义函数指针类型的成员,从而实现了在结构体中使用函数的目的。
  • 函数指针在结构体中的赋值方法

    千次阅读 2017-08-10 11:23:10
    一、 定义了一个结构体 struct abc{ int (*a)();...要这些函数指针成员赋值 struct abc abcd={ .a=fun1, .b=fun2, .c=fun3, }; 二、 #include
  • 以下为源码,我照着一本C语言教材打的,定义了两个求较小的数的指针函数,但是输出的值总是很大的数字,而且和赋的值无关,请问这是怎么回事? #include "pch.h" #include int main() { int * minp(int *...
  • 什么是回调函数? 百度的权威解释如下:回调函数就是...运行结果:从这个例子可以看到,我们首先定义了一个函数指针fuc,这个函数指针的返回值为void型,然后我们给函数指针赋值,赋值为print,也就是print函数的首地址,此
  • 函数指针在结构体里的赋值与调用

    千次阅读 2019-02-18 15:29:36
    #include &...//定义函数指针结构体类型 typedef struct test { void (*a)(int a,int b); void (*b)(void); void (*c)(void); }test; //编写函数实现 void f1(int a,int b) { p...
  • 该指针变量可以指向我们希望指向的地址,如我们有数组为a[2] = {0,1},那么我们可以通过指针变量赋值,使其指向该数组Ptr = a;。 函数指针实际上和这种指针类似,只不过其变量类型是一个函数类型而已。如果觉得搞...
  • 类其实也是一种数据类型,也可以发生数据类型转换,不过这种转换只有在基类(父类)和派生类(子类)之间才有意义,并且只能将派生类赋值给基类,包括将派生类对象赋值给基类对象、将派生类指针赋值给基类指针、将...
  • 关于指针函数赋值的问题

    千次阅读 2018-07-11 17:04:11
    1、最简单的有swap(int a,int b)函数,估计这个大家都是知道的。其实这也是下面要讨论的问题的症结所在,那就是函数的参数和传进的变量之间的关系,我们可以通过程序输出地址发现,参数和传入的变量并不是公用一个...
  • 通过函数指针调用C++非静态成员函数通过函数指针调用C++非静态成员函数

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 414,170
精华内容 165,668
关键字:

如何给函数指针赋值

友情链接: iyf.zip