171029—函数自学【函数地址和函数指针】

原创 2017年10月30日 19:51:54

前言:本篇多数说法来自个人理解。在理论、逻辑上

学到现在,发现了函数一个和之前接触的变量相比最大的不同之处:函数的调用只要提供函数的入口地址。
复习一下:

int a;int & b=a
cout<<a;变量名访问
cout<<b;引用名访问
cout<<&a;取变量地址
cout<<*(&a);间址访问

再看:

int func()
 func()
 &func//取函数地址,但函数只要你提供地址它就可以被访问。所以这样的形式也可以调用函数。

二.函数类型: 一类相同函数的抽象
注意:函数类型,取决于包括但不仅限函数返回值的类型。一个函数的类型要看它的参数种类及个数以及其返回值的种类。
基于此,联系变量(常量)有各种不同的类型。函数也可以有,而且可以人为定义:

typedef 类型 函数类型名(形式参数表)        typedef int functionkind(int,int,char)

这样的操作定义了一个类型的函数,其函数类型名为:functionkind。这个类型名是一类具有相同接口的函数的抽象。在此之后

functionkind main,maxmin; 
和
int a,b,c;

上述两行代码对比来看,第一行即是先定义了函数类型,而后只需以此形式声明,即可声明这三个函数
(注意,只是完成了三个函数的声明而已,没有进行定义,因为。。你家的函数体写了??)
到此,既然函数有了类型,那么指向函数的指针当然也有类型之别:

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

或者我们可以直接把定义函数类型和相应指针的工作一并完成:
使用关键字typedef

typedef 类型(*指针类型)(形参表);

而在定义完指针类型之后,将函数地址赋给指针,就可以调用函数。

有函数func;
有指针p;
p=func//即给指针赋值(函数地址值)
x=p(3.14//此步即等价于x=func(3.14)

可以通过函数调用的原理来理解这件事:
在Cpp中,上述的几种形式都是函数的代码模块在内存的入口地址值,称为函数地址。于此,我们只要提供了函数的地址,就可以调用函数。
函数这种代码对象和普通数据对象性质不同
所以调用函数的语句: 函数地址(实际参数表)即可完成

当参数是函数时:

套用数学概念即需要一个符合函数时。即此函数在定义时就需要另外一个函数作为参数时。我们可以通过指针来完成做参数的这个函数的调用。

P.S.
今日函数开始授课。仍有收获:
指针即地址,地址即指针。指针变量是存放指针的东西。
对指针变量赋值即改变指针指向。
对指针变量赋0即让其悬空。 P=0;
.main函数是所有函数的入口函数。

C语言之函数指针和函数的首地址

1、爆简单的代码       因为容易忘记,还是再记录一次吧。        2、展示结果                至于函数指针用法,一眼便知      对于add和&add你应该这样理解,...
  • u011068702
  • u011068702
  • 2017年03月06日 18:03
  • 661

函数指针函数名转换成内存地址调用

1、   (*(void(*) ())0)(); 这是《C Traps and Pitfalls》这本经典的书中的一个例子。 第一步:void(*) (),可以明白这是一个函数指针类型。这个函数没有参...
  • gengyiping18
  • gengyiping18
  • 2015年03月02日 15:00
  • 964

C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧

要对绝对地址0x100000赋值,我们可以用       (unsigned int  * ) 0x100000 = 1234;       那么要是想让程序跳转到绝对地址是0x100000去执行...
  • judyge
  • judyge
  • 2015年11月13日 22:58
  • 1050

C语言函数指针跳转到程序固定地址(0x8000)执行程序的方法

C语言函数指针跳转到程序固定地址(0x8000)执行程序的方法 int main(void) { void (* my_function)(void); //int *my_add...
  • mcu_hong
  • mcu_hong
  • 2013年03月13日 21:09
  • 2904

根据函数指针地址获取函数名

man backtrace_symbols_fd,里面有对应的实例,或也可参考 http://blog.csdn.net/snow168rain/article/details/52043719, 其...
  • zhqh100
  • zhqh100
  • 2017年03月30日 21:01
  • 869

C语言使用函数指针跳转到程序固定地址(0x8000)执行程序的方法

C语言使用函数指针跳转到程序固定地址(0x8000)执行程序的方法
  • HengZo
  • HengZo
  • 2016年05月24日 20:35
  • 1632

关于将函数的地址作为参数传递给另一个函数调用

1.在讲这个问题之前,我们要明白一个问题。就是我们为什么要把一个函数的地址作为参数传递给另一个参数。要知道在C语言中,一个函数内部是可以直接调用其他函数的,既然可以直接调用,为什么还要用这么麻烦的办法...
  • c_flybird
  • c_flybird
  • 2015年10月26日 22:38
  • 3741

delphi 中的函数指针 回调函数

delphi 中的函数指针 回调函数
  • rznice
  • rznice
  • 2015年01月27日 08:49
  • 2646

函数类型,函数名是函数指针吗,函数的强制类型转换

问一:函数有类型吗? 答:有,举两个例子即可明白: 例1:char func()的类型为char (*)()  例2:int * func1(char a)的类型为int *(*)(char) ...
  • zhangzhi123456789
  • zhangzhi123456789
  • 2015年10月19日 19:16
  • 1677

【调试】打印函数栈,以及由函数指针输出函数名的方法

打印函数栈,以及由函数指针输出函数名的方法
  • snow168rain
  • snow168rain
  • 2016年11月30日 17:18
  • 1423
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:171029—函数自学【函数地址和函数指针】
举报原因:
原因补充:

(最多只允许输入30个字)