美文网首页
函数指针&二级指针

函数指针&二级指针

作者: 放牛的星星 | 来源:发表于2017-04-26 16:24 被阅读105次

函数指针

顾名思义函数指针就是指向函数的指针,这个指针是指向一个函数地址,我们在定义函数的时候也会像变量一样,有一个内存地址,但不同于变量,变量存储的是固定的值,而函数存储的是函数的内在地址。通过函数指针可实现Java多态的效果。让我们体验一下函数指针吧!

void funcPoint1(){
    printf("这里是函数1:%d\n",333);
}
void funcPoint2(int i){
    printf("这里是函数2:%d\n", i);
}

void main(){
    //函数指针的定义,返回值(*函数指针名称)(函数参数)=&函数名称

    //无参指针函数
    void(*funcP1)() = &funcPoint1;
    //有参数的指针函数
    void(*funcP2)(int) = &funcPoint2;


    //调用函数指针
    funcP1();
    funcP2(3);
    printf("函数1指针地址:%#x\n", funcP1);
    printf("函数2指针地址:%#x\n", funcP2);
    system("pause");

}

输出:

这里是函数1:333
这里是函数2:3
函数1指针地址:0x12a1050
函数2指针地址:0x12a1055
int add(int n1,int n2){
    return n1 + n2;
}
int minus(int n1,int n2){
    return n1 - n2;
}
//我们可以函数指针作为函数参数传入,实现java中的多态
void addOrMinus( int (*f)(int,int),int a,int b){
    int c = f(a,b);
    printf("计算出来的值为:%d\n",c);

}
void main(){
    addOrMinus(add,3,4);
    addOrMinus(minus,99,3);
    system("pause");
}

输出:

计算出来的值为:7
计算出来的值为:96

通过传函数地址,就可以调用该函数进行操作,在Android开发中经常会用到网络数据的回调,NetCallBack功能,那么C中就可以应用函数指针进行实现如:

#include <windows.h>//这里需要引入线程休眠头文件
/*
 *网络请求数据
 */
void netRequest(char* url,void(*callBack)(char*)){
    printf("请求地址:%s\n",url);
    Sleep(2000);
    callBack("服务端的数据");
}
/*
 *回调函数
 */
void callBack(char* netResult){
    printf("网络请求回调函数\n");
    printf("来自服务端的数据:%s\n",netResult);
    system("pause");
}
void main(){
    char* url = "www.baidu.com";
    netRequest(url,callBack);
}

输出:

请求地址:wwww.baidu.com
网络请求回调函数
来自服务端的数据:服务端的数据

二级指针

说白了就是指向指针的指针

void main(){
    int i = 100;
    //定义p指针变量(该p指针本身也是一个内存地址)存储的是i的内存地址
    int * p = &i;
    //定义pp指针变量存储的是p指针的地址
    int **pp = &p;
       //*p与的差别:p是一个地址,*p是p取地址的值.
        printf("指针地址:%d\n",*p);
    printf("指针地址:%#x\n",&p);
    printf("指向指针的地址:%#x\n",&pp);

    printf("修改之前的值为:%d\n",**pp);
    //多级指针就是要往上一级一级的找,然后通过*来操作内存空间
    **pp = 30;
    printf("修改之后的值为:%d\n",**pp);
    system("pause");
}

输出:

指针地址:0x30f788
指向指针的地址:0x30f77c
修改之前的值为:100
修改之后的值为:30

指针是操作内存的神器,二级指针,不管是几级指针只要记住里面存储的是上级指针的地址。

指针运算

void main(){
    int ids[] = { 56, 89, 56, 33, 15 };
    //数组变量名:ids就是数组的首地址
    printf("%#x\n",ids);
    printf("%#x\n", &ids);
    printf("%#x\n", &ids[0]);
    //以上三个都是同一个地址

    //指针变量
    int *p = ids;
    printf("%d\n",*p);//取第一个值
    //指针的加法
    p++;
    printf("%d\n", *p);//取第二个值

    p = p + 2;//取第三个的值33
    printf("%d\n", *p);
    system("pause");
}

函数指针的内存分配

那么指针为什么要有类型,它与地址有什么差别:

  • 地址只是开始的位置

相关文章

  • 函数指针&二级指针

    函数指针 顾名思义函数指针就是指向函数的指针,这个指针是指向一个函数地址,我们在定义函数的时候也会像变量一样,有一...

  • 02-C语言的指针

    02-C语言的指针 目标 C语言指针释义 指针用法 指针与数组 指针与函数的参数 二级指针 函数指针 指针在C中很...

  • 二级指针

    关于二级指针,可以参考这篇文章[二级指针的作用详解] 所谓二级指针可以理解为:指向指针的指针函数通常会将参数拷贝一...

  • ndk02_指针运算,函数参数与指针,数组指针,二级指针

    一、指针运算 二、数组与指针 三、指针和函数参数 四、指针数组 五、 二级指针 六、知识要点 1、C语言中的函数如...

  • C语言基础及指针④函数指针

    接续上篇C语言基础及指针③函数与二级指针 在上一篇中 , 我们学习了函数与二级指针 , 函数和java中的方法类似...

  • C语言指针部分说明

    二级指针 函数指针 数组和链表 访问数组 访问链表 Makefile

  • 学习笔记3(指针运算,函数参数与指针,数组指针,二级指针)

    一、指针运算 二、数组与指针 三、指针和函数参数 java中: C/C++中: 四、指针数组 五、 二级指针 六、...

  • c基础—指针运算和函数指针

    二级指针 数组和数组指针 采用指针遍历数组循环赋值 遍历 赋值 指针与数组的几种写法 函数指针(回调) 题目:监听...

  • 二级指针

    二级指针做函数输出特性 指针数组的使用 一维数组

  • 函数指针

    概念: 指针函数, 函数指针, 指针数组, 数组指针, 指向数组的指针, 指向函数指针数组的指针。

网友评论

      本文标题:函数指针&二级指针

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