精华内容
下载资源
问答
  • ​猜猜下列例子运行会什么结果?class 运行结果:a 前两个应该都会段错误才对呀,怎么都运行正常了。其实上述行为都由this指针左右结果。0x00 静态函数没有this指针 静态方法随着类加载而加载,静态方法不...

    675925abbd1bdde461d4a590a8f3d8d7.png
    ​猜猜下列例子运行会有什么结果?
    class A
    {
    public:
        static void print()
        {
            printf(">>>>>n");
        }
    
        void print2()
        {
            printf("+++++n");
        }
    
        void print3()
        {
            printf("====%dn", value);
        }
    
    private:
        int value;
    };
    
    int main(int argc, char *argv[])
    {
        A *a = NULL;
        a->print();
        a->print2();
        a->print3();
        return 0;
    }
    

    运行结果:

    a->print()  输出:>>>>>
    a->print2() 输出:+++++
    a->print3() 程序段错误
    

    前两个应该都会段错误才对的呀,怎么都运行正常了。其实上述的行为都由this指针左右结果。

    0x00 静态函数没有this指针

    静态方法随着类的加载而加载,静态方法不需要实例化。不会引用到this指针里面的数据,所以static void print()不会报错。

    0x01 成员函数不使用this指针不报错

    a->print();可以近似看作void print(A *a):

    void print(A *a)
    {
        printf("+++++n");
    }
    

    由此A的实例a指针没有被使用,不会访问到错误的地址而出现异常。

    0x02 空指针引用实例成员才会异常

    void print3()中使用了实例a的value成员,由于a为空,没有指向具体的内存,导致引用value内存出错。

    0x03 总结

    上述行为引起段错误的原因是空指针实例引用了成员变量导致的。


    更多精彩文章请关注微信公众号:「Qt君」

    展开全文
  • ​猜猜下列例子运行会什么结果?class A { public: static void print() { printf(">>>>>n"); } void print2() { printf("+++++n"); } void print3() { ...

    4cd0de9fab00bf4c255f892e9a171c50.png
    ​猜猜下列例子运行会有什么结果?
    class A
    {
    public:
        static void print()
        {
            printf(">>>>>n");
        }
    
        void print2()
        {
            printf("+++++n");
        }
    
        void print3()
        {
            printf("====%dn", value);
        }
    
    private:
        int value;
    };
    
    int main(int argc, char *argv[])
    {
        A *a = NULL;
        a->print();
        a->print2();
        a->print3();
        return 0;
    }
    

    运行结果:

    a->print()  输出:>>>>>
    a->print2() 输出:+++++
    a->print3() 程序段错误
    

    前两个应该都会段错误才对的呀,怎么都运行正常了。其实上述的行为都由this指针左右结果。

    0x00 静态函数没有this指针

    静态方法随着类的加载而加载,静态方法不需要实例化。不会引用到this指针里面的数据,所以static void print()不会报错。

    0x01 成员函数不使用this指针不报错

    a->print();可以近似看作void print(A *a):

    void print(A *a)
    {
        printf("+++++n");
    }
    

    由此A的实例a指针没有被使用,不会访问到错误的地址而出现异常。

    0x02 空指针引用实例成员才会异常

    void print3()中使用了实例a的value成员,由于a为空,没有指向具体的内存,导致引用value内存出错。

    0x03 总结

    上述行为引起段错误的原因是空指针实例引用了成员变量导致的。


    更多精彩文章请关注微信公众号:「Qt君」

    展开全文
  • 在这个主函数的指针给子函数传递一个指针,而在子函数中形参开辟了一块内存,此子函数的指针的内存里存储的地址与主函数是同一地址, 即主函数的指 针和子函数形参的指针都指向同一块内存的地址,但是在子函数...

    典型的错误例子如下

    在这个主函数的指针给子函数传递一个指针,而在子函数中形参有开辟了一块内存,此子函数的指针的内存里存储的地址与主函数是同一地址,

    即主函数的指 针和子函数形参的指针都指向同一块内存的地址,但是在子函数里,为子函数的指针申请了一块空间,并不影响主函数的指针。

    因为子函数的指针又指向了别的内 存。要想分配成功就得用下面两个例子。一个是在子函数的形参中第一指向指针的指针即二级指针,

    叫子函数的指针指向实参的指针,另外一种方法就是返回子函数 分配完内存的指针。

    失败的例子

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    fen_pei(char *p,int n)
    {
    p=(char *)malloc(n*sizeof(char *));
    if(p==NULL)
    {
       printf("allocation failture\n");
       exit(0);
    }
    
    }
    
    int main()
    {
    char *str1=NULL;
    fen_pei(str1,10);
    strcpy(str1,"hello");
       printf("%s\n",str1);
      
       return 0;
    }
    成功的方法1,返回分配内存的指针

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    char *fen_pei(char *p,int n)
    {
    p=(char *)malloc(n*sizeof(char *));
    if(p==NULL)
    {
       printf("allocation failture\n");
       exit(0);
    }
    return p;
    }
    
    int main()
    {
    char *str1=NULL;
    str1=fen_pei(str1,10);
    strcpy(str1,"hello");
       printf("%s\n",str1);
      
       return 0;
    }
    成功的方法2.,在子函数形参中使用指向指针的指针

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    void fen_pei(char **p,int n)
    {
    *p=(char *)malloc(n*sizeof(char *));
    if(p==NULL)
    {
       printf("allocation failture\n");
       exit(0);
    }
    
    }
    
    int main()
    {
    char *str1=NULL;
    fen_pei(&str1,10);
    strcpy(str1,"hello");
       printf("%s\n",str1);
      
       return 0;
    }




    展开全文
  • 由于类的非静态成员函数一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样。 1、指向一般函数的指针函数指针的声明中就包括了函数的参数类型、顺序和返回值,只能把相匹配的函数...
  • 关于函数指针方面东西,下面一个程序,可以加深一下对这方面理解. #include void f(int i) { printf("in f() i = %d\n", i); } int main() { int i; void (*ptr)(int); printf("%p %p\n", f, *****f);

    关于函数指针方面的东西,有下面一个程序,可以加深一下对这方面的理解.

    #include<stdio.h>
    void f(int i)
    {
            printf("in f() i = %d\n", i);
    }
    int main()
    {
            int i;
            void (*ptr)(int);
            printf("%p      %p\n", f, *****f);
            f(10);
            (***********f)(30);
            ptr = f;
            ptr(40);
            (ptr)(50);
            (**********ptr)(55);
            i = (unsigned long)f;
            (*(void (*)(int))i)(70);
            ((void (*)(int))i)(90);
            ((void (*)(int))f)(100);
            (*(void (*)(int))f)(120);
            return 0;
    }

    对于这种方式,主要在于C语言中的函数是一种function-to-pointer方式,即对于函数,要将其转化成指针类型的.
    ptr是函数指针类型,则*ptr是该指针所指向的函数,而由于函数自身又转化成指针了,所以说*ptr又转化成了ptr这种函数指针类型,因此,前面无论有多少个*号,最后都是对这个函数的调用.
    而之前的(**f)(30),这种方式,也是与上面分析的一样,函数转化成函数指针,对该函数指针解引用,又得到函数.所以说这种方式也是正确的.
    对于后面的来说,i的值是函数f的地址,前面的(void (*)(int))是一个函数指针的强制转化方式,将该i的值转化成一个函数指针,而该函数指针又是一个带整形参数,且没有返回值的函数.因此((void (*)(int))i)(70)这种方式就是对该函数的一种调用.先将该地址转化成了这种函数指针的方式,然后再去调用,至于最前面的那个*号,可要可不要.所以说两种方式都是正确的.
    对于最后面一种方式,也是先将该函数转化成了一个函数指针,然后又去调用这个函数指针.同样也是调用这个函数了.

    展开全文
  • 该文件主要是函数方面的例子有函数的调用,函数应用,函数指针
  • 在Modern C++ Design第二章第一节,一个关于定制编译器错误提示的例子:templatebool> struct CompileTimeChecker { CompileTimeChecker(...); //一个接受任何参数构造函数};template struct ...
  • 在这个主函数的指针给子函数传递一个指针,而在子函数中形参开辟了一块内存,此子函数的指针的内存里存储的地址与主函数是同一地址,即主函数的指 针和子函数形参的指针都指向同一块内存的地址,但是在子函数里,...
  • 今天刚好需要用到通过数组中函数指针来调用函数,所以就写了了一个例子,但是遇到了问题。 在程序运行后,就是得不到结果。 一开始,我以为你是 add_table函数调用失败,后来我验证后发现还是调用了,只是没有...
  • 匿名函数调用方式两种,第一种是作为返回值匿名函数,第二种是直接调用匿名函数。上面的例子是作为返回值匿名函数。 作为返回值匿名函数 我们首先使用 GBD 调试上面的例子。 $ gdb test $ l $ l $ b 16 #...
  • 使用空指针调用成员函数会如何? 举个例子:base是基类,里面两个函数:non-virtual func2 以及 virtual func1; derived是派生类,使用public继承自base,里面四个函数:virtual func1,non-virtual func3,non...
  • 例如,可能会一个函数调用表格,根据不同的情况调用表格中不同的类成员函数。今天使用一个简单的例子来讲述如何使用类成员函数指针。类成员函数指针定义因为函数是一个类的成员,所以它的指针定义别于全局函数,...
  • 函数指针

    2017-12-27 10:20:45
    C语言中的函数指针两个比较常用的例子: 1. 回调函数 2. 转移表1.回调函数 把指向函数的指针传递给第二个函数作为参数,那么第一个函数就叫做回调函数。作用: 对具有相同参数类型的一系列函数的统一管理...
  • C++回调函数和this指针的实例

    千次阅读 2016-03-09 17:26:00
    在类非静态函数的形参列表里,个隐含this指针,但是静态成员函数没有this指针,所以类静态成员函数无法调用非静态成员。要想在静态成员函数调用成员,需要将当前this指针传进去。在下面的例子实现...
  • 函数指针的理解

    2013-01-10 11:54:40
    函数指针,顾名思义就是指向函数的指针,为什么需要函数指针,函数指针的作用是什么? 函数指针一共两个作用:调用函数和作为函数的参数。 1:首先写个例子: 代码中实现了一个test函数,然后在main函数调用...
  • 下面我举一个比较简单 的例子,设一个函数process,在调用时候,每次实现不一样功能,输入a,b第一次调用process时找出a和b中大者,第二次找出小者,第三次求和。程序如下:#include&lt;stdio.h&...
  • 函数调用时栈以及寄存器指针的变化 举了一个具体的例子来说明,配图示
  • 指向函数的指针

    2012-04-06 15:39:15
    程序在编译后,每个函数一个首地址(也就是函数第一条指令的地址),这个地址称为函数的指针。可以定义指向函数的指针变量,使用指针变量间接调用函数。下面通过一个简单的例子来说明: float max(float x,flo
  • 关于回调函数和函数调用

    千次阅读 2017-10-31 15:44:19
    关于回调函数和函数调用看STM32F767HAL文档时候发现程序回调函数对于理解整个程序还是很大帮助,就想写下了,顺便就加深对回调函数理解。回调函数介绍: 回调函数:实质就是传址调用,系统可以像QT中...
  • 了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针两个用途:调用函数和做函数的参数。 我们首先来看一个函数指针的例子: #...
  • C语言中指向函数的指针

    千次阅读 2017-10-02 10:34:54
    程序在编译后,每个函数一个首地址(也就是函数第一条指令的地址),这个地址称为函数的指针。可以定义指向函数的指针变量,使用指针变量间接调用函数。下面通过一个简单的例子来说明: float max(float x,...
  • 看到“明显调用的表达式前的括号必须具有(指针)函数类型”这句时我才发现我的语文水平多烂,怎么看都看不懂,折腾了半天才知道是哪里出了问题。 举个简单的例子 class CTest { void (CTest::*m_pFun)(); ...
  • 函数指针的使用

    2015-01-08 19:01:21
    1,声明格式 type (* name) (type arg1,...) 与函数声明不同地方,就是把夲身的函数名换成(*name)。 下面的例子用了一个typedef化简...将函数名(也就是函数的地址)赋值给函数指针。 3,调用 调用可以两种
  • 1. 函数指针 直接使用 通过typedef使用, 当使用了typedef后,函数指针名就...加上作用域后,成员函数指针已没有问题了,但调用的时候出现问题,来看一下正确的使用方法: 上面使用了两种,一种是成员函数指针定义

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 736
精华内容 294
关键字:

有函数调用的指针例子