精华内容
下载资源
问答
  • c++函数地址
    千次阅读
    2018-03-12 15:31:44
    rt
    更多相关内容
  • C/C++ 获取函数地址

    千次阅读 2020-07-17 00:11:19
    通过函数名就可以得到函数地址 #include <stdio.h> #include <stdlib.h> void fun() { } int main() { printf("%p\n", &fun); } 对于 fun 和 &fun 应该这样理解: fun 是函数的首地址...

    C

    • C语言中没有类的概念,只有普通的函数。通过函数名就可以得到函数地址
    #include <stdio.h>
    #include <stdlib.h>
    
    void fun() {
    	
    }
    int main() {
    	printf("%p\n", &fun);
    }
    
    • 对于 fun&fun 应该这样理解:

      • fun 是函数的首地址,它的类型是 void ()
      • &fun 表示一个指向函数 fun 这个对象的地址, 它的类型是 void (*)()
    • 因此 fun&fun 所代表的地址值是一样的,但类型不一样。

      • fun 是一个函数
      • &fun 表达式的值是一个指针!

    C++

    • 普通函数
      C++的普通函数和C中是一样的,利用函数名就可以获得函数地址。

    • 类静态函数
      本类所有对象公用一个静态函数,所以是同一个地址【其实类的成员函数都只有一个,解释见后文】。和普通函数一样,有了函数名就可以获得地址。
      可以用类名::函数名,也可以用对象.函数名 / 对象指针->函数名

    • 类成员函数(除了静态函数外的所有类中的函数)

      有这样一个类:

      class Base {
      public:
      	Base() {
      		cout << "Base构造" << endl;
      }
      virtual ~Base() {
      	cout << "Base虚析构" << endl;
      	}
      	virtual void f1() {
      		cout << "Base::f1()" << endl;
      	}
      	void f2() {
      		cout << "Base::f2()" << endl;
      	}
      	virtual void f3() {
      		cout << "Base::f3()" << endl;
      		//cout << data << endl;	
      	}
      	int data = 5;
      	static void fn() {
      	}
      };
      
      

      如果这样输出:

      cout << &Base::f1 << endl;	// 普通类成员函数
      cout << &Base::f2 << endl;	// 虚函数
      
      // cout << &p->f1 << endl;
      // cout << &p->f2 << endl;
      // 这两个都会报错,对象绑定的函数只能用于调用
      

      那么输出结果都是 :1。明显不是函数地址值。

      首先分析一下这几种成员函数在运行机制的不同

      • 静态函数,是独立于对象的,是类拥有的,所以我们调用静态函数,既可以通过类调用也可以通过对象调用。无论是通过类调用还是对象调用,对应的都是同一个函数。

      • 动态函数,只能通过对象来调用。因为在动态成员函数中,往往都需要访问对象的成员变量。我们知道同一类型的不同对象,它们拥有类中成员变量的不同副本,所以假如动态成员函数由类来调用,我们无法知道在函数中访问的是哪一个对象的成员变量。

        要输出动态函数的地址,必须通过对象来获取。

        C++调用非静态的成员函数时,采用的是一种 __thiscall 的函数调用方式。采用这种调用方式,编译器在编译的时候,会在调用的函数形参表中增加一个指向调用该成员函数的指针,也就是我们经常说的this指针。调用的形式类似于Base::f1(Base* this, otherparam…),在函数体中,涉及到对象的成员变量或者其他成员函数,都会通过这个this指针来调用,从而达到在成员函数中处理调用对象所对应的数据,而不会错误处理其他对象的数据。可见,虽然我们必须通过对象来调用动态函数,但是其实我们访问的都是同一个成员函数。所以我们采用&Base::f1来获取成员函数地址是没错的,动态函数同样是跟类绑定而不是跟对象绑定的。

        出错的原因是,输出操作符<<没有对void(__thiscall A:: *)()类型重载,编译器将这种类型转换为bool类型,所以输出了1;

        对于静态函数,其调用方式并非__thiscall,<<有对它的重载,因此类的静态函数可以直接用cout输出函数地址。我们可以用printf输出,因为他可以接收任意类型的参数,包括__thiscall类型

      cout << p->fn << endl;		// 静态成员函数可以直接获取地址
      cout << Base::fn << endl;	// 静态成员函数可以直接获取地址
      
      cout << &Base::f1 << endl;	// 编译器将void(__thiscall A::*)()类型转换为bool类型。 输出 1
      printf("Base::f1()地址:%p\n", &Base::f1);
      printf("Base::f2()地址:%p\n", &Base::f2);
      printf("Base::fn()地址:%p\n", &Base::fn);
      
    展开全文
  • C++ 中如何输出函数地址

    千次阅读 2021-03-08 21:40:08
    C++ 中如何输出函数地址 #include <iostream> void hello() { } int main(int argc, char *argv[]) { std::cout << hello << std::endl; std::cout << &hello << std::...

    C++ 中如何输出函数的地址

    #include <iostream>
    
    void hello()
    {
        
    }
    
    int main(int argc, char *argv[])
    {
        std::cout << hello << std::endl;
        std::cout << &hello << std::endl;
        return 0;
    }
    

    输出结果为:

    1
    1
    

    显然输出结果是错误的,究其原因,是C++中的cout对象没有重载以函数指针为入参的<<运算符

    解决方法,把函数指针强制转换为void*类型,如下:

    #include <iostream>
    
    void hello()
    {
        
    }
    
    int main(int argc, char *argv[])
    {
        std::cout << (void*)hello << std::endl;
        std::cout << (void*)&hello << std::endl;
        return 0;
    }
    

    输出结果为:

    0x401630
    0x401630
    

    可以看到 hello 和 &hello输出结果相同,均代表函数地址。

    展开全文
  • 【C/C++】获取函数地址并调用

    千次阅读 2018-07-19 16:39:02
    函数地址、函数指针

    通过获取函数地址和声明函数指针的方法调用函数,具体使用如下:

    void func(){ cout << "func()" << endl; }
    int main()
    {
        int addr = (int)func;//保存函数地址
        ((void(*)())addr)();//调用
    
        void (*ptr)();//声明函数指针
        ptr = func;//指针赋值
        ptr();//调用
    
        return 0;
    }//输出结果为两行func()
    展开全文
  • C++回调函数详解

    千次阅读 多人点赞 2021-05-07 22:34:54
    1、什么是回调函数 2、为什么需要回调函数 3、什么函数可以作为回调函数
  • C++函数详解

    千次阅读 多人点赞 2021-05-14 00:19:08
    c++函数 1、函数的概念 什么是函数 在《C++Primer》中对于函数这样说道: 函数是一个命名了的代码块,我们通过调用函数执行相应的代码,函数可以有0个或者多个参数,而且会产生一个结果 对于我的总结: 我觉得函数...
  • C++虚表地址和虚函数地址

    千次阅读 2019-04-12 20:17:44
    C++虚表地址和虚函数地址 虚函数是c++实现多态性的一个重要知识点,本文主要解析虚函数在内存中的地址,以及与虚表地址的关系。 声明一个类,包含两个虚函数,一个普通成员函数和一个类成员。 调试程序,查看...
  • C++ 函数重写

    千次阅读 2022-04-12 18:37:06
    前言: 今天遇到一个问题,C++的问题,函数重写。自从上学的时候学过C++重写的定义,以及做过点题就再也没有思考...C++函数重写的定义其实就是父类有一个函数A,子类继承了父类的A函数,看A函数不顺眼,自己重新实
  • 获取C++成员函数地址

    千次阅读 2019-05-04 15:05:23
    参考文章:https://www.cnblogs.com/nbsofer/p/get_member_function_address_cpp.html AppleDemo.h: class CAppleDemo { public: CAppleDemo(); ~CAppleDemo(); void fun1(void);... in...
  • C++函数数组

    千次阅读 2019-01-25 14:21:03
    在日常编码过程中,我们经常使用到数组,以C++的基本数据类型作为存储对象,而在某些特殊的情况下,我们需要使用到函数数组或函数指针(譬如回调函数),其实质为一个指针数组,数组内存储着各个函数的指针地址,在...
  • C++函数指针详解

    千次阅读 2020-02-05 17:26:09
    详细讲解函数指针的作用,声明,赋值,使用,附有代码。
  • C++函数返回值

    千次阅读 多人点赞 2020-03-12 19:03:15
    首先,强调一点,和函数传参一样,函数返回时也会做一个拷贝。从某种角度上看,和传参一样,也分为三种: 一般(传统)返回:返回任意类型的数据类型,会有一个拷贝,对于复杂对象效率低下;例如:int test(){}或者...
  • C++函数定义

    千次阅读 2021-04-22 15:09:38
    C++函数定义前言1、函数的概念2、函数的定义3、函数的调用4、函数的分文件编写 前言 学习黑马程序员关于C++的笔记 1、函数的概念 作用:将一段经常使用的代码进行封装,减少重复代码,增加代码利用。 2、函数的定义 ...
  • python中调用C++函数

    千次阅读 2021-01-04 14:48:13
    python中调用C++函数 无参调用 单变量传入与返回调用 numpy数组传入与返回调用 用python写不香吗?还这么复杂调用C++? 一、 无参调用 在python中调用无参数和无返回的C++函数,具体的使用方式如下: C++API函数的...
  • C++函数详解

    千次阅读 多人点赞 2021-12-27 20:43:38
    C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。 类的虚表 每个包含了虚函数的类都包含一个虚表。 我们来看以下...
  • c++ 函数指针

    万次阅读 多人点赞 2019-06-15 21:41:38
    函数地址就是函数名,要将函数作为参数进行传递,必须传递函数名。 声明函数指针 声明指针时,必须指定指针指向的数据类型,同样,声明指向函数的指针时,必须指定指针指向的函数类型,这意味着声明应当指定函数...
  • C++匿名函数

    千次阅读 2022-03-08 21:23:48
    C++中的匿名函数,类似于python的lambda函数,也就是在句中定义和声明的一个临时函数,仅在调用时才会创建函数对象,无需在头文件中声明。 二、匿名函数的形式 [capture](parameters)->return-type{body} ...
  • 传值 参数传进来之后只是一个局部变量,修改形参的值不会改变实参的值,也就是在函数里面改变该参数并不会改变主函数里面该变量的值。 #include<...传进来的是一个地址,通过这个地址可以找到该地址存放的
  • c++函数调用数组

    千次阅读 2021-03-31 14:10:16
    int fun(int a[3][2]) { } int main() { fun(a); }
  • c++ 构造函数详解

    万次阅读 多人点赞 2019-05-31 17:20:58
    c++构造函数详解。(构造函数的分类、拷贝构造函数
  • C++输出函数地址的方法

    千次阅读 2017-10-27 16:24:04
    我们知道,C++函数是指令的集合,程序的入口地址函数名标识。跳转到程序入口地址就可以依次执行集合中的指令。那么,如果想输出函数地址应该怎么做呢? #include using namespace std; void haha(){ cout; }...
  • C++函数前后加const

    千次阅读 多人点赞 2019-04-22 15:17:01
    const更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。 函数前面的const: 返回值为const; 函数后面的const: const函数; const的函数不能对其数据成员进行修改操作。 const的对象,不能引用非...
  • c++ 类成员函数地址

    千次阅读 2018-04-10 10:48:32
    类成员函数类型声明和变量定义c++ 成员函数地址声明方式和定义如下:类型声明:typedef void (MyClass::*pFunType)(); 或using pFunType2 = void (MyClass::*)();变量定义:void (MyClass::*p1)();例子:class ...
  • c++函数指针和函数对象

    千次阅读 2019-04-07 17:29:05
    C++ 函数指针和函数类型一、 导述二、c++成员函数在内存中的存储方式新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个...
  • 1 C++函数如何像python一样返回多个返回值 使用过python的童鞋都知道,在python单个函数中可以返回多个函数值,比如: # -*- coding: utf-8 -*- def return_muliti_value(): return 1,'helloworld',[1,2,3] if __...
  • c++返回函数指针的函数

    千次阅读 2021-07-17 20:43:05
    类似于数组名,在C语言中函数名的实际就是函数所在空间的首地址,故也可声明相应类型的函数指针用于指向相应的实际函数,更深层次甚至可以声明函数指针数组和返回函数指针的函数 定义格式:声明函数指针时需要指出...
  • c++ 函数声明与定义

    千次阅读 2021-05-29 19:56:23
    为什么 C++ 允许多次声明呢
  • 使用GetProcAddress获取C++重载函数

    千次阅读 2015-09-20 20:02:33
    GetProcAddress函数是用来在动态加载完动态链接库后,从链接库中获取函数地址的。
  • C中如何调用C++函数?

    千次阅读 2020-04-09 09:00:34
    我在学习RT-Thread的时候使用了一些C++包,在以C语言的主函数中调用总是找不到C++相关函数,添加头文件等C语言的调用函数处理方式在调用C++函数时似乎不能正常编译。于是看到这篇文章,简短扼要、非常有效。
  • C++函数指针、指针函数、返回值为函数指针的函数浅谈 引言 函数指针、指针函数是C中重要而容易混淆的概念,博主将通过两个实例来说明这两个截然不同的概念。 而返回值为函数指针的指针函数就更难理解了,放在文章的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,653,217
精华内容 661,286
关键字:

c++函数地址

c++ 订阅