今天一天没学习啦!我去医院补牙了。牙坏了,有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);//然后我们调用时候不行啊,因为参数不对,所以又要转换回来!
}

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

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

逻辑与算法分离

  

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

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