- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)