• 我也要学C语言第十六章:返回指针值的函数与指向函数的指针以及逻辑与算法分离


      今天一天没学习啦!我去医院补牙了。牙坏了,有1个洞。不过我边补牙边在听中山大学的汇编语言视频教程,虽然只能听,但是还是有点收获的。昨天的帖子很抱歉啦,因为里面有个叫宝石的朋友发来疑问,我当时在学其他知识,没有仔细的看!当时我理解错了他的意思,我在这里向你道歉。我学的那行代码肯定是有问题的,但是在某些宽松的场合,可以很简洁的去表达呢!

      C语言学到现在正好2周时间了,我觉得C语言还是蛮给力的。争取在3个星期结束C语言的学习,当然这仅仅是在探索语法原理上的。也就是说至少我每写一行代码,我都知道它以何种形式存在于内存的哪个地方。我想呢!只有明白了这些以后才能逐步的去锻炼C语言的内功。不过我们知道了语法原理后在遇到问题时,我们可以很快速的锁定问题在在哪里,因为我们知道了它的构架,我们就可以调试去寻找错误。

    返回指针值的函数

      1 返回值为指针型数据的函数,定义一般的形式为:

        类型名 *函数名(参数表)

      例如:int*  func(int x, int y);

      解释:表示func的返回值为指向int型数据的指针。

      注意点:函数名前的*只表示范围值为指针型数据

          *func两侧没有括号。

      返回指针值的函数的例子与调试呢,我就不写了,因为我觉得这个还是非常简单的了。我重点写下面的知识点,指向函数的指针。

    指向函数的指针

      为什么会存在指向函数的指针:因为啊!函数作为一段程序,在内存中也要占据一片存储区域呢!它就会有一个起始地址,即函数的入口地址,这个就好像世界地图,每个国家对就像世界地图上的1块空间,如果从1个固定的地方往1个方向看,每个国家都会有1个地方是离你最近的,这个最近的地方就好比函数的入口地址,也就是它的起始地址啦!这个地址我们就叫它函数的指针。

      指向函数的指针有什么作用啊:这样一来啊,我们就可以定义一个指针变量指向函数,然后通过指针调用函数。将函数作为参数在函数间传递。

      使用指向函数的指针会给程序带来什么好处啊?:我暂时还不知道,继续往下学,说不定就知道啦!

      既然函数有1个入口,那么函数有多少个出口啊?出口就看return啦!有多少个return就有多少个出口哦!

         指向函数的指针变量定义:类型名 (* 指针变量名) ();

      指向函数的指针的更深入一层去理解:因为编译器会把函数翻译出所对于的机器代码,那么这个机器代码的第一个字节的地址就是函数的                                                           首地址,也就是指向函数的指针。

      间接调用与直接调用:通过函数指针来调用函数叫间接调用,通过函数名来调用叫直接调用。

    例子:

        int (*p)()

    表示:p是一个指向函数的指针变量,此函数的返回值为int型。

    代码事例:

    大家看了这段代码是不是发现了1个问题啊p和Max并不相等啊,这个是为什么啊?!当然只有加油去搜寻资料了!。。。。。。10分钟后!原来是这样的,大家看这个:

    哦!我们明白啦!在401005这里有个jmp跳转。原来函数指针被归纳在一个跳表里去啦!但是这个只是在debug方式下会这样做哦!

    我们再来看一段代码:

    #include<stdio.h>

    int Max(int x, int y)
    {
    return x>y?x:y;
    }

    void main()
    {
    int a;
    int (*p)(int) = NULL;
    p
    = (int (*)(int))Max;//其中int (*)(int)这段呢!是一个数据类型,表示一个单参函数的指针,作用是把1个
                             双参函数的地址强制说成是1个单参函数的地址。

    a
    = ((int (*)(int, int))p)(2, 9);//然后我们调用时候不行啊,因为参数不对,所以又要转换回来!
    }

    哇!函数指针的类型转换好郁闷啊!但是我必须要学懂!以后肯定会遇到的!

    注意:由于这类指针变量等于一个函数的入口地址,所以它们做加减运算是无意义的。(嘿嘿!这句话又像谭老师!虽然我没有看过他的书!但是我觉得呢!这些结论只是我暂时的理解!以后可能会有新的认识的!加油!!!)

    逻辑与算法分离

      

    大家看:这样一来我们的算法和逻辑分开啦!这样的话,我们想换算法,换参数就可以啦!我们把算法给参数化了!

        这一节笔记就写到这里了!大家一起加油!学习知识,让生活更美好!

  • 相关阅读:
    将所有程序设置XML集中到一个单独XML配置文件的方法:使用appSettings元素的configSource元素
    MVC中JQuery文件引入的路径问题,@Url.Content函数
    EF的表连接方法Include()
    在使用EFCodeFirst中出现类型“System.Data.Objects.ObjectContext”在未被引用的程序集中定义的解决方案
    总结下遇到的C#新语法
    MVC3下的layout页面
    C#委托初探
    WebBrowser Control
    Python之面向对象二
    Python之面向对象一
  • 原文地址:https://www.cnblogs.com/dodolook/p/2072778.html
Copyright © 2020-2023  润新知