C语言指针函数,C语言指针函数

1,C语言指针函数应该这样写:int *compare (int x,int y)表示一个自定义函数,有两个整型的参数 x和y,函数的返回值是一个整型的指针 。给你个例,程序是我手机随写上传,头文件自己加上,没有经过编译,如有笔误,请说出来: typedefint (*MYFUN)(int x,int y);int fun_a(int x,int y){return x+y;}intfun_b(int x,int y){return y-x;}void main(){MYFUN a=fun_a; int b=a(1,9);cout<<compare是一个函数指针,函数参数为(int x, int y) 返回值为int【C语言指针函数,C语言指针函数】
2 , c语言 指针你把for循环里的p<(p+10)改为p你的for循环有问题 。判断条件中两边都有变量 p<(p+10)p为正数就相当于 1<(1+10)那是永远不能满足的 , 除非p为负数了所以要改改int a[10], *p;int i=0;p=&a[0];for(i=0;i<10;i++) scanf("%d", p++);这句有点问题,应该是: for (;p<(a+10);p++)int a[10],*pp=&a;for(;p<(p+10);p++)scanf("%d",p);如果不能正常输入的话enter-----------ctrl+z----------------enter
3 , c语言 指针修改如下:#include<stdio.h> void main()void average(float *p,int n);/*注意这里*/void search(float (*p)[3]); /*注意这里*/float score[3][3]=average(&score[0][0],9);/*注意这里*/search(score); } void average(float *p,int n)/*注意这里*/int sum,i,k;for(i=0;i<n/3;i++) /*注意这里*/sum=0;for(k=0;k<3;k++)/*注意这里*/sum=sum+*(p+i*3+k); /*注意这里*/aver=sum/3;printf("average= %5.2f\n",aver);} } void search(float p[][3])/*注意这里*/int i,j,flag;float aver,sum=0;for(i=0;i<3;i++)flag=0;for(j=0;j<3;j++)if(*(*(p+i)+j)<60)flag+=1;if(flag>1)printf("NO.%d fails,his scores are:\n",i+1);for(j=0;j<3;j++)printf(" %5.1f",*(*(p+i)+j));for(j=0;j<3;j++)sum=sum+*(*(p+i)+j);aver=sum/3;printf(" %5.2f\n",aver);}} }
4 , C语言指针函数如果在程序中定义了一个函数 , 那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址 。而且函数名表示的就是这个地址 。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针 。那么这个指针变量怎么定义呢?虽然同样是指向一个地址,但指向函数的指针变量同我们之前讲的指向变量的指针变量的定义方式是不同的 。例如:int(*p)(int, int);这个语句就定义了一个指向函数的指针变量 p 。首先它是一个指针变量,所以要有一个“*”,即(*p);其次前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数 。所以合起来这个语句的意思就是:定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数 。p 的类型为 int(*)(int , int) 。所以函数指针的定义方式为:函数返回值类型 (* 指针变量名) (函数参数列表);“函数返回值类型”表示该指针变量可以指向具有什么返回值类型的函数;“函数参数列表”表示该指针变量可以指向具有什么参数列表的函数 。这个参数列表中只需要写函数的参数类型即可 。我们看到,函数指针的定义就是将“函数声明”中的“函数名”改成“(*指针变量名)” 。但是这里需要注意的是:“(*指针变量名)”两端的括号不能省略,括号改变了运算符的优先级 。如果省略了括号,就不是定义函数指针而是一个函数声明了,即声明了一个返回值类型为指针型的函数 。那么怎么判断一个指针变量是指向变量的指针变量还是指向函数的指针变量呢?首先看变量名前面有没有“*”,如果有“*”说明是指针变量;其次看变量名的后面有没有带有形参类型的圆括号,如果有就是指向函数的指针变量,即函数指针 , 如果没有就是指向变量的指针变量 。不是的 看楼上的回答char *match (char*s,char ch1,char ch2) 函数各部分的含义:第一个char,一般是代表函数的返回值是一个字符 。但是它后面有一个*,应该把char和*连起来看 , 就是char*了 。那么,第一个就是char* , 代表函数的返回值是一个字符指针(地址) 。match是函数的名字 。括号内是函数的参数,多个参数用逗号分隔 。本例共有3个参数:char*s,char ch1,char ch2,第一个是s , 类型为char*型(字符指针型),后两个ch1、ch2都是char型(字符型) 。到这儿,你就知道去掉*match前的*为什么就不对了 。另外,括号里参数类型(如包含指针)跟函数返回值的类型无关 。函数名前加不加*只与函数返回值的类型有关 。在最上面加一句这样的定义 typedef void*(*pFn)(); pFn可以这样理解:首先pFn是一个指针,指针指向一个函数(或者说pFn是一个函数指针),此函数返回一个无类型的指针 。最终定义的变量及函数都是指针罢了,不过是指针的类型不同 。所以在编译时会有警告 , 说指针类型不匹配 。但对于程序来讲,都是可以在特定的上下文中使用的 。运行结果是 t1,t2交替出现 。其实void也可以换为其它的类型如int, double等 又想到一个很好的办法:这次编译不会有警告 , 运行也不会出错 。示例代码如下所示 #include long t1(); long t2(); int main() { long(*fn)()= (long (*)()) t1 ; while(1){ fn = (long (*)()) fn(); } } long t1() { printf("t1\n"); return (long)t2 ; } long t2() { printf("t2\n"); return (long)t1 ; }不是这样match函数名前的char* 是表示match函数结束时返回的值是一个字符串(char*), 如果把match前的*去掉, 即 char match( ......), 是表示match函数返回的值是一个字符(char), 那么你在match函数最后的return 语句要用相对应的数据类型5 , C语言中的函数指针函数指针是定义一个指向函数的指针,形式为:void (*p)(void);一般用法:int fun1(int x);int fun2(int x);char fun3(int x);int fun4(char x);int main(void)int (*p)(int x);p=fun1;//指向fun1p(2)//这时等价于fun1(2)p=fun2;//也可以指向fun2。。但是注意了 , p=fun3;和p=fun4都是错误的,参数类型跟返回类型必须一样 。至于指针函数,就是返回一个指针的函数 。基本形式:int *fun(void);一般用法:int *fun(void);int main(void)int *p=NULL;//声明一个整型指针变量p=fun();//接收fun()的返回值。。在c语言中,指针被广泛使用,而函数指针是最为高级的用法之一 , 也是容易疑惑的地方之一 。看下面这段代码:#include void f(int a, int* output) { printf("a = %d\n", a); *output = a + 1; } typedef void (*func)(); int main() { func f = f; int ret = 0; f(3, &ret); printf("ret = %d\n", ret); return 0; } 上面看出 func 的类型是与f的类型不匹配的,这样可以通过编译吗? 答案是: 可以的 。由于在c语言中编译函数的时候,是仅仅将其函数名作为该函数的 唯一标识,为其分配相应地址 。所以虽然func 与 f的类型不一致,但是对于编译器看来 都是两个地址,是无所谓的 。用上面的特点,可以写出非常通用的函数指针类型,typedef int (*func)(); 这里之所有要有返回值,是用来标识该函数是否执行成功的错误代码标志 。随说做了有一段时间的c了,但尽然没有搞明白函数指针的用法,见到了也没有好好研究,今天终于有时间了,在网上搜了一下,终于弄懂了.原来就是定义了一个指针变量,只不过形式有点怪罢了.其实还是当成指针用就行了! 一般有两种用法: 1定义函数指针 int (*functionpoint)(int, int)----这只是定义了一个指向函数的指针 int a(int a,int b)----------------这是与之相符的函数原型 void main()-----------------------使用 { functionpoint = a;------------先赋值 functionpoint(1,2);----------调用 } 2用typedef定义使用 typedef int (*functionpoint)(int,int);----------定义了一种类型名为functionpoint的指针 int a(int a, int b)-----------------------------函数原型 void main() { functionpoint fun;---------------------------定义指针 fun = a;-------------------------------------赋值 fun(1,2);---------------------------------使用 } 函数就是这个函数的指针.函数指针是指向函数的指针变量 。因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数 。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数 。int func(int x); /* 声明一个函数 */int (*f) (int x); /* 声明一个函数指针 */f=func; /* 将func函数的首地址赋给指针f */赋值时函数func不带括号,也不带参数,由于func代表函数的首地址 , 因此经过赋值以后,指针f就指向函数func(x)的代码的首地址 。注2:函数括号中的形参可有可无,视情况而定 。下面的程序说明了函数指针调用函数的方法:例一、#include<stdio.h>int max(int x,int y)void main()int (*ptr)(int, int);int a,b,c;ptr=max;scanf("%d%d",&a,&b);c=(*ptr)(a,b);printf("a=%d,b=%d,max=%d",a,b,c);}ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量 , 不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了 。在程序中把哪个函数的地址赋给它 , 它就指向哪个函数 。而后用指针变量调用它,因此可以先后指向不同的函数 。不过注意 , 指向函数的指针变量没有++和--运算,用时要小心 。指针函数是指返回值是指针的函数,即本质是一个函数 。我们知道函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针 。其定义格式如下所示:返回类型标识符*返回名称(形式参数表)返回类型可以是任何基本类型和复合类型 。返回指针的函数的用途十分广泛 。事实上 , 每一个函数,即使它不带有返回某种类型的指针 , 它本身都有一个入口地址,该地址相当于一个指针 。比如函数返回一个整型值 , 实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量” 。其实还是指针,只是指向的内容和声明方法不同而已

    推荐阅读