本帖最后由 gdmgb520 于 2011-3-21 22:24 编辑
论坛发帖对格式支持不是很好,而且图片不能直接贴上来的,一个一个上传麻烦。所以直接上传了word
以下是文档内容(不含图片)
-----------------------------------------------------------------
感觉使用EW430学习C语言指针真的很不错,可以很好的跟踪程序,可以看到内存的变化,从而加深对指针的理解。今天记一下“指向函数的指针和指向函数的指针作函数的参数”的学习情况。参考书依然是谭浩强老师的C语言课本。先学习了课本10.5节。以该节最后的一个问题作为题目进行了实践。编写如下代码: Main.c int main( void ) { extern float f1(float x,float y); extern float f2(float x,float y); extern float integral(float a,float b,float (*fun)(float,float)); // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; float integ; float (*pf)(float,float); //定义一个指向函数的指针,该类型的函数返回值是float,且有两个float类型的参数。 //求积分 pf=f1; //把f1函数的入口地址赋值给函数指针pf integ = integral(0,1,pf); //函数指针作为函数的参数 integ++; pf = f2; integ = integral(0,1,pf); integ++; } Integral.c //该函数的第三个参数是一个指向函数的指针 float integral(float a,float b,float (*fun)(float,float)) { float result; result = (*fun)(a,b); //通过指向函数的指针调用函数 return(result); } float f1(float x,float y) { return(0.5*y*y + y - 0.5*x*x - x); } float f2(float x,float y) { return(y*y + 3*y - x*x -3*x); } 在 IAR EW IDE下,进入debug模式。程序初始化以后可以在Watch窗口中看到 即,函数f1的入口地址是在FLASH中的0xE44C,函数f2的入口地址是0xE3C0。那么我们验证一下。在 Disassembly窗口中我们找到0xE44C地址,在这里我们可以看到实际的FLASH中存放的是什么东东。找到该地址,可以看到: 可以看到0xE44C确实是函数f1() 的入口地址,函数的第一条语句是把寄存器R10的值压入堆栈。 好,下面看第一行代码,pf=f1。在执行该语句之前可在watch窗口中看到pf 的值为unavailable,该语句的作用是把函数f1的入口地址存入pf这个指向函数的指针变量中。那么执行该语句后pf的值应该等于0xE44C。执行该语句,然后再看watch窗口: 可以看到运行结果与我们推测的一致。然后程序进入下一行,integ = integral(0,1,pf);执行该语句后程序跳到integral()函数中result = (*fun)(a,b);语句处,执行该语句程序跳转到f1函数处,在Disassembly窗口中可以看到程序指针跳到了0xE4C处。执行完后程序调转到主程序的integ++;行。这样就完成了一次调用。
|