C语言指向函数的指针承载的信息比较复杂,组织起来要素要写全。根据指向函数的指针的书写语法,下面的代码就是一个返回函数指针的函数:int (*f(void))(int){//f是函数,没有参数,返回指向一个函数的指针;这个被指向的函数有一个int型形参,且返回一个int值 return fun;//fun是个函数名,必须具备一个int形参、返回int值的要求}以下代码可以验证上述函数的正确性:pre t="code" l="cpp"//#include "stdafx.h"//If the vc++6.0, with this line.
目前创新互联已为上千的企业提供了网站建设、域名、虚拟主机、成都网站托管、企业网站设计、泰兴网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
#include "stdio.h"
int fun(int n){
printf("abcdef\n");
return n;
}
int (*f(void))(int){
return fun;
}
int main(void){
printf("%d\n",f()(100));//调用函数f,通过f返回的指针用100调用函数fun
return 0;
}输出是:abcdef100
个人见解,希望有点用:
1).区别 *(p+(year-2000))和 *(p+month)中的两个p的涵义,它们是不相关的:
第一个p是函数中的形参,同时是行指针,指向一个包含12个元素的一维数组;
第二个p是主函数中的指针变量。
2).假设前面的信息都已输入,你要查找2003年各个月份的情况。输入2003后,
调用函数search(rain,year)后, p+(year-2000)即为p+3,是数组rain第3行的首地址,*(p+3)就是数组rain第3行第0列的首地址了。
此时,返回值为rain[3][0].在主函数中p=rain[3][0],于是p+month=rain[3][month],//
*(p+month)=rain[3][month].//即为2003年各月份情况。
#includestdio.h
#includestdlib.h
int main()
{
float score[][4]={60,70,80,90, 56,89,67,88, 34,78,90,66}; //把*去掉
float *search (float (*pointer)[4],int n);
float *p;
int i,m;
printf("enter the number of student:");
scanf("%d",m);
printf("The scores of No.%d are:\n",m);
p=search(score,m);
for(i=0;i4;i++)
printf("%5.2f\t",*(p+i));
system("pause");
}
float *search(float (*pointer)[4],int n)
{
float *pt;
pt=*(pointer+n);
return (pt); //括号是中文下的,改英文下的
}
这种方式叫做“用指针函数*creat()的返回值来传递动态内存”,这是一个C语法
首先你要注意,子函数*creat()用了malloc动态申请内存,而return返回的是指针变量所指向的地址,而不是指针!相当于将你所申请的动态内存返回给主函数
int
*fun(void)//这里是指针函数
{
int
*p
=
(int
*)
malloc
(int);//动态申请内存//p在这里指向了一块合法内存的地址
return
p;
}
void
main(void)
{
int
*q
=
NULL;
q
=
fun();//fun()返回指针p所指向的地址,(指针p是在栈上创建的,所以*fun()函数运行完,指针所分配的内存被系统自动释放)这时q指向p,得到了malloc所申请到的内存
free(q);//释放动态内存
}