美文网首页
函数指针和指针函数

函数指针和指针函数

作者: 耳_总 | 来源:发表于2017-11-07 22:10 被阅读49次
函数指针

概念:函数指针,顾名思义是一个指针变量,指向一个函数。
代码:

/**
 * 函数指针
 */
void msg(char* msg) {
    printf("函数指针:%s",msg);
}

void main() {
    //函数的返回值、指针变量名、函数的参数列表
    void(* fun_p)(char* msg) = msg;
    fun_p("调用了函数");   
}

1、定义:void(* fun_p)(char* msg) = msg;定义一个fun_p的函数指针变量,定义的规则为void修饰符,取决于需要指向的函数的返回值,加上括号内的函数指针变量名,最后跟上指向函数的参数类型、赋值,调用方式和方法调用一致
那么为什么一个函数可以赋值给一个指针呢?因为所有程序是数据和指令的集合(忘了在哪里看到过了)。可以在VS里面反汇编,得到函数的汇编指令。
可以输出下函数的地址:

printf("%#x\n",msg);
    printf("%#x\n",&msg);
输出:
0xee0
0xee0

输出的都是函数的地址,这里和数组有点相似。

真正函数有什么作用呢?可以作为回调函数,在java里面类似于观察者模式的回调。
例子:

int add(int a,int b){
    return a+b;
}

int minus(int a,int b) {
    return a-b;
}

int msg(int(*func_p)(int a,int b),int m,int n) {
    return func_p(m,n);
}

void main() {
    printf("%d\n",msg(add, 5, 4));
    printf("%d\n",msg(minus, 5, 4));
    
}

这里的特性非常强大,只要符合定义的函数指针任何函数都可以作为参数传递。

指针函数

就是一个普通的函数,只是返回值是一个指针类型的参数,就和平时的函数返回int类型是一个意思。

int f(){
  return 0;
};
int i = f(); //普通的返回值函数
---
int* f(){
    int i = 0;
    int *p = &i;
    return p;
}
int *f_p = f();返回的参数是一个指针
关于C语言任意类型的指针的问题

有时候一个函数指针——比如malloc();返回的是void* ,但是在使用的使用的时候例如开辟一个int类型的数组:
int *p = malloc(sizeof(int));这样子将它转为int类型的指针,那么我们在p++的时候就会按照每次跳跃一个int所占的字节去寻址。
free()释放内存函数也是一样的。

  • 需要注意的是:在我们操作指针进行操作的时候,最好定义一个新的指针去操作,避免对原始的指针的变动而造成的不确定性问题
    int* a = p;用a来操作。不过也是要看具体情况的。

  • 动态内存分配是连续性的

  • reallloc();内存扩充,第一个参数是原来地址的指针,第二个参数是扩充后的总大小,失败第一个参数一定要是第一块内存的首地址,(如p为原来的首地址,如果进行了p++操作,再去扩充就会失败的),返回时新的扩充的地址的首地址,根据是否有连续的地址去判断是在原来的地址后面扩充还是,全部新建地址。另外,这里扩充的第二个参数既可以是整数(扩充),也可以是负数(释放内存),如果重新分配失败,返回NULL,原来的指针指向的内存仍然有效。

  • calloc()和malloc一样,只是参数有所区别,calloc需要传两个参数,一个单位长度,一个个数

  • 不能多次释放内存,一般释放完成之后给指针为空,因为内存空间释放了,指针还指向那个内存地址,再次释放就会出错。

  • p重新赋值再释放不可以,这一点和上面的观点一致,因为p如果重新赋值 了,执行的不是准备释放的内存的首地址了,所以才释放失败。

相关文章

  • C:函数指针的坑

    关于该死的函数指针和指针函数 先来个目录 常量指针、指针常量 数组指针、指针数组 函数指针、指针函数 1、先看第一...

  • C++:函数指针 & 返回函数指针的函数

    函数指针 & 返回函数指针的函数 一、函数指针的声明和使用 声明一个函数指针,给它赋值并调用它指向的函数 函数指针...

  • 指针函数,函数指针,和位运算

    1.函数指针和指针函数的区别 函数指针是指向函数的指针变量,即本质是一个指针变量 指针函数可用于将一个函数作为参数...

  • 函数和指针

    函数指针: 指向函数的指针(是指针)指针函数:返回值是指针的函数(是函数)

  • C++ 函数指针和函数类型

    函数指针和函数类型 函数指针指向的是函数而非对象。和其他指针类型一样,函数指针指向某种特定类型。 函数类型由它的返...

  • 将函数名作为参数被另外一个函数调用

    函数名作为参数,需要使用函数指针,下面就来看一下什么是函数指针 什么是函数指针 函数指针和指针、数组指针是一个系列...

  • 函数指针和指针函数

    函数指针 概念:函数指针,顾名思义是一个指针变量,指向一个函数。代码: 1、定义:void(* fun_p)(ch...

  • 指针函数和函数指针

    指针函数 指针函数是指带指针的函数,即本质是一个函数,函数返回类型是某一类型的指针。int *f(x,y); 函数...

  • 指针函数和函数指针

    指针函数 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。 ...

  • 指针函数和函数指针

    1、指针函数 指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针。声明格式如下: 类型标识符...

网友评论

      本文标题:函数指针和指针函数

      本文链接:https://www.haomeiwen.com/subject/gzxyuxtx.html