函数指针学习.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1. 首先,在C语言中函数是一种function-to-pointer的方式,即对于一个函数,会将其自动转换成指针的类型.如: #includestdio.h void fun() { } int main() { printf(%p? ?? ?%p? ?? ?%p\n, fun, fun, *fun); return 0; } 复制代码 这三个值的结果是一样的. 其实对于最后的那个*fun, 即使前面加上很多个*号, 其结果也不变, 即**fun, ***fun的结果都是一样的. 对于这个问题, 因为之前讲过函数是一种 function-to-pointer方式, 其会自动转换成指针的类型, fun是该函数的地址, 为指针类型, fun是一个函数, 会转换成其指针类型, 而对于*fun, 由于fun已经变成了指针类型, 指向这个函数, 所以*fun就是取这个地址的函数, 而又根据function-to-pointer, 该函数也转变成了一个指针, 所以以此类推, 这三个值的结果是相同的. 2. 如何调用一个地址上的函数 ??如果知道了一个函数所在的地址, 可以将其强制转化成某一种类型的函数指针, 然后再根据这个指针去调用这个地址的函数. 如: #includestdio.h void f(int i) { printf(i = %d\n, i); } int main() { unsigned long add; add = (unsigned long)f; ((void (*)(int))add)(10); (*(void (*)(int))add)(20); return 0; } 复制代码 使用(void (*)(int))的方式可以将一个地址转换成一个带int参数且没有返回值的函数的指针类型, 然后再去调用, 由于第1点中讲的function-to-pointer, 所以最后两条语句中加与不加那个*号效果都是一样的. 在嵌入式方面经常用到这种方式. 3. 函数指针数组的用法. 有时候需要定义一个数组, 其内容为一系列的函数指针, 然后对其进行调用, 如: #includestdio.h int max(int v1, int v2) { return (v1 v2 ? v1 : v2); } int min(int v1, int v2) { return (v1 v2 ? v1 : v2); } int sum(int v1, int v2) { return (v1 + v2); } int main() { int (*p[3])(int, int); p[0] = max; p[1] = min; p[2] = sum; printf(p[0] = %d\n, (p[0])(3, 5)); printf(p[1] = %d\n, (p[1])(4, 6)); printf(p[2] = %d\n, (p[2])(1, 2)); return 0; } 复制代码 虽然感觉这种方法有点累赘, 但是也算是一种使用的方式, 所以介绍一下. 4.返回一个指向数组的指针的方式 可以让函数返回一个指向数组的一个指针, 如: #includestdio.h #includestdlib.h int (*p())[10] { int (*m)[10]; int i; m = (int (*)[10])malloc(10 * sizeof(int)); if (m == NULL) { printf(malloc error\n); exit(1); } for (i = 0; i 10; i++) *(*m+i) = i+1; return m; } int main() { int (*a)[10]; int i; a = p(); for (i = 0; i 10; i++) printf(%d , *(*a+i)); printf(\ndone\n); return 0; } 复制代码 这种方式中,int (*a)[10]是一个指向一维数组的一个指针, 而p()也是返回一个指向一维数组的一个指针. 5.返回一个函数指针的指针 对这个问题, signal()函数是最好的例子, void (*signal (int signo, void (*func)(int)))(int); 复制代码 很多朋友刚开始看这个函数定义的时候是不太懂, 其实可以一步一步地慢慢看, 我以前是这样分析的, 希望能对大家有用. int (*p)(); 这是一个函数指针, p所指向的函数是一个不带任何参数, 并且返回值为int的一个函数. int (*fun())(); 这个式子与上面式子的区别在于用fun()代替了p,而fun(

文档评论(0)

word.ppt文档 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档