指针函数和函数指针,C语言中指针函数和函数指针有什么区别

1,C语言中指针函数和函数指针有什么区别指针函数:本质是一个函数,返回值是一个指针函数指针:本质是一个指针变量 , 该指针变量指向一个函数 。指针本质上其实是一个地址值,就像你的邮编一样 。你根据这个指针所代表的地址去送信,敲敲门,开门的是一个函数,那么就称这个指针为函数指针 。程序在编译时,每一个函数都有一个入口地址,这个入口地址就是函数指针所指向的地址
2,c语言指针函数和函数指针有什么不同如楼上所说。指针函数 的本质是 函数 ,只是他的返回值 类型 是指针变量 。比如 int *A(int num); 这就是一个 指针函数 。函数指针 是一个 指针变量,只不过 他是 指向函数的指针变量 。比如有函数定义 如上 int * A(int num);再有 int (*pf)(int num);则是 pf = A;就把 函数A的首地址 赋值给 pf 函数指针了 。指针函数本质是函数,函数的返回值为指针;而函数指针本质是指针,指向一个函数的指针 。指针函数本质是函数,函数的返回值为指针;而函数指针本质是指针,指向一个函数的指针 。指向函数的指针 就是指函数可以通过函数的指针间接地调用指针函数 是指函数的返回类型是指针而已 当需要返回地址时常用 比如要返回数组等等指针函数本质是函数,函数的返回值为指针;而函数指针本质是指针,指向一个函数的指针 。指针函数是说一个函数 , 它的返回值是一个指针;函数指针是一个指针,它指向一个函数 。【指针函数和函数指针,C语言中指针函数和函数指针有什么区别】
3,关于函数指针和指针函数1.def是一个指针,指向的内容也是指针 , 而这个指针指向的是一个有10个元素的数组 2.gh是一个指针,指向的是10个元素的数组,这个数组中的10个元素放的是double型的指针 3.f是一个数组 , 元素呢就是指向double型的函数 4.b是一个指针,指向了10元素的数组,数组中放的是 int*新手,有错的一定要告诉我哦,一起学习float(**def)[10] def是什么?---指针数组,能理解float(*def)[10] ,就能理解它 。double*(*gh)[10] gh是什么?---与上面的理解是一样的,double(*f[10])() f是什么?---返回指针数组的函数,也就是说一个行返回的是一组值int*((*b)[10]) b是什么?---跟2的理解一样这个是有规律的,(1) def是一个指针, 指向的对象也是一个指针, 指向的指针最终指向的是10个float构成的数组. (2) gh是指针, 指向的是10个元素构成的数组, 数组的元素是double*类型的指针. (3) f是10个元素构成的数组, 每个元素是指针, 指针指向的是函数, 函数类型为无参数且返回值为double. 下面要讲的窍门的例子跟这个很类似. (4) b是指针,指向的是10个元素构成的数组, 数组元素为int*类型的指针. 窍门如下: 如果我们碰到复杂的类型声明,该如何解析它?例如: char (*a[3])(int); a到底被声明为什么东东?指针?数组?还是函数? 分析时 , 从a 最接近(按运算符优先级)处开始 。我们看到a最接近符号是[ ]——注意:*比[ ]的优先级低 。a后既然有[ ],那么a是数组 , 而且是包含3个元素的数组 。那这个数组的每个元素是什么类型呢?虽然数组a只含有a[0]、a[1]、a[2]三个元素,a[3]实际上已经越界 , 但在分析数组a的元素的类型时,我们正好需要形式上的元素a[3] 。知道了a[3]的类型,就知道了a的元素的类型 。a[3]是什么类型?是指针,因为它的前面有*. 由此可知 , 数组a的元素是指针 。光说是指针还不够 。对于指针,必须说出它指向的东东是什么类型 。它指向的东东是什么,就看*a[3]是什么(a[3]是指针 , 它指向的东东当然是*a[3])了 。继续按优先级观察,我们看到*a[3]后面有小括号,所以可以肯定*a[3]是函数 。即数组a的元素是指向函数的指针 。指向的是什么类型的函数?这很明显,是入参为int、返回值为char的类型的函数 。至此解析完毕 。按上述方法,再复杂的也可以一步步解析出来 。就像习武不是为了打人而是为了防身一样,我们了解上述方法是为了看懂别人写的复杂声明,而不是为了在实践中自己去构造这种复杂的东东 。实在需要复杂声明时,可以用typedef替代一部分 。例如上面语句可改成两句: typedef char (*FUN_PTR)(int); FUN_PTR a[3]; 这样就清晰多了 。此外 , 上面的分析方法还让我们对某些东西的本质更加清楚 。比如,n维数组的本质都是一维数组 。看个具体的例子: int a[3][5]; 这句声明的是一个包含3个元素的一维数组,其每个元素又是一个由5个int数构成的数组 。我们不能理解为:a是一个包含5个元素的一维数组,其每个元素又是一个由3个int数构成的数组 。为什么?还是按上面的方法分析,这里从略 。有的书上或网上提供"向右看,向左看"的方法, 其实缺乏通用性, 比如它不适用于对多维数组本质的分析. 而且这种方法掩盖了本质. 本质应该是按上面所讲的,根据运算符优先级逐层剥开.
4,C语言 指针函数 函数指针 什么区别联系最好有例子一定采纳搜指针函数 本质上是一个函数,只不过函数的返回值是指一个指针,比如定义 int *func(int );函数指针 本质上是一个指针,只不过指针指向的是一个函数,比如定义 int (*p2func)(int );b函数指针常见的例子就是:一个函数的函数名 。eg:intfun (int a, int b)return a + b}fun就可以叫做这个函数的函数指针 。当然,我们也可以自己定义一个函数指针变量指向fun 。eg:int (fp* ) (int ,int)(它定义格式有点奇怪 , 不过没办法) fp 就是一个int (*) (int, int) 类型的函数指针 。fp = fun;然后可以再其他函数里面调用了.假设int main (void)int sum = fd (1, 2);//等价于 int sum = fun (1, 2);printf ("sum = %d\n", sum);return 0;}void function ( void)这个函数的函数指针是function, 如果我们想用一个函数指针来指向function,必须要类型一致,包括函数返回类型和 形参格式 。指针函数指的是函数返回值是个指针,本质是个函数 。eg:假设有一个数组intarr[length]int*function (int* arr, int length)int* tmp;sum = arr + 1;return sum;}这个返回值是指向arr[length] 第二个元素的地址 。大概就想到这些 。。没觉得指针函数这个概念有什么大的意义 。。。。可能其最大的意义就是拿过来和函数指针一起混淆初学者的视听吧 。指针函数指的是返回一个指针的函数,比如我们常见的gets(),strcpy(),strcat() , malloc()等等 。如果单独把它当成一个新概念真的没有什么意义 。这些函数除了返回一个指针之外没有任何共性,但是返回的指针又天差地远 。下面说说函数指针 。指针分为三种类型:对象指针 , 函数指针和void指针 。函数指针的声明形式是T (*p)(...),其中*p使用括号括起来的原因是函数类型解析的优先级高于指针的解析,故使用括号防止解析成上面的指针函数(其实这两个之间就相差了一对括号) 。函数指针可以绑定到与其返回值和参数类型都相同的函数上 。比如:int foo(int, double); // 函数声明int (*bar)(int, double) = foo; // 函数指针在上面的初始化中,写成&foo也是可以的 。函数指针的最大特点就在于,其不能做一元+-运算(当然也不能做+= -= ++ --等),且对其做一元*运算的结果还是其本身 。例如:(接着上面的例子)bar(1,1.0);(*bar)(1,1.0); // 两种情况等价甚至你还可以这样:(**************bar)(1,1.0);依然是对的 。所以实际应用中一般采取类似函数调用的方式,这样更加自然 。刚刚去测试了一下,还有一个更加隐蔽的问题:C中的函数可以采用使用原型或者不使用两种方式 。(不使用原型被视为过时)原型即在函数头中将参数类型及个数都声明,而不使用就是很简单的一对括号 。例如:int foo(); // 非原型int bar(void); // 原型int foo1(int); // 原型这有什么影响呢?看一看下面的一段代码:int foo(int i)int foo1(double c)int bar()int main(void) int (*foobar)(int); // 原型 int (*barfoo)(); // 非原型 foobar = foo; foobar = &foo; foobar = bar; foobar = foo1; // this barfoo = foo; barfoo = bar; barfoo = foo1; foobar(1); (*foobar)(1); (*************foobar)(1); return 0;}我的编译器对this指的一行进行了警告,提醒指针类型不匹配 。我们可以看到 , 非原型的函数指针可绑定到任意的函数上,而带有原型的函数指针在绑定时可以起到更严格的类型限制 。容易忽略的一点是,不接受任何参数的函数(带原型)的声明方式是int foo(void);,不应该省略void,特别是在使用对应类型的函数指针时,如果省略void,那么错误的绑定也不会被警告 。我还注意到了一个现象:int foo(char);int (*bar)() = foo;这段代码同样也给了警告 。为什么呢?因为在不使用原型的情况下,char,short,float等会被隐式提升到与其对应的更高级类型 。而在这个绑定中,bar是非原型,这时可能会进行整型提升,而foo带有原型,调用时不需要进行提升 。这样就有可能引发错误 。以上就是函数指针使用过程中需要注意的一点 。不过提醒LZ , 函数指针使用过程中最好还是使用带有原型的函数指针 。5,C语言中指针型函数和函数型指针的区别指针函数,本质上是一个函数 , 只是函数的返回值是一个指针,比如int *f()函数指针,本质上是一个指针,只是指向的是一个函数,比如int (*f)()简言之,函数指针就是指向函数(函数入口地址)的指针,指针函数就是返回数据类型为指针的函数函数指针:void(*fun)();指针函数:type *fun();其中type为数据类型,比如char,int等等简言之 , 函数指针就是指向函数(函数入口地址)的指针,指针函数就是返回数据类型为指针的函数函数指针:void(*fun)();指针函数:type*fun();其中type为数据类型 , 比如char,int等等1 函数指针变量在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址 。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数 。然后通过指针变量就可以找到并调用这个函数 。我们把这种指向函数的指针变量称为“函数指针变量” 。函数指针变量定义的一般形式为:类型说明符(*指针变量名)();其中“类型说明符”表示被指函数的返回值的类型 。“(* 指针变量名)”表示“*”后面的变量是定义的指针变量 。最后的空括号表示指针变量所指的是一个函数 。例如:int (*pf)();表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型 。本例用来说明用指针形式实现对函数调用的方法 。int max(int a,int b)if(a>b)return a;else return b;}main()int max(int a,int b);int(*pmax)();int x,y,z;pmax=max;printf("input two numbers:\n");scanf("%d%d",&x,&y);z=(*pmax)(x,y);printf("maxmum=%d",z);}从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:1) 先定义函数指针变量 , 如后一程序中第9行 int (*pmax)();定义 pmax为函数指针变量 。2) 把被调函数的入口地址(函数名)赋予该函数指针变量 , 如程序中第11行 pmax=max;3) 用函数指针变量形式调用函数,如程序第14行 z=(*pmax)(x,y);4) 调用函数的一般形式为:(*指针变量名) (实参表)使用函数指针变量还应注意以下两点:a) 函数指针变量不能进行算术运算,这是与数组指针变量不同的 。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的 。b) 函数调用中"(*指针变量名)"的两边的括号不可少 , 其中的*不应该理解为求值运算,在此处它只是一种表示符号 。2 指针型函数前面我们介绍过,所谓函数类型是指函数返回值的类型 。在C语言中允许一个函数的返回值是一个指针(即地址) , 这种返回指针值的函数称为指针型函数 。定义指针型函数的一般形式为:类型说明符 *函数名(形参表)……/*函数体*/}其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针 。类型说明符表示了返回的指针值所指向的数据类型 。如:int *ap(int x,int y)....../*函数体*/}表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量 。本程序是通过指针函数,输入一个1~7之间的整数,输出对应的星期名 。main()int i;char *day_name(int n);printf("input Day No:\n");scanf("%d",&i);if(i<0) exit(1);printf("Day No:%2d-->%s\n",i,day_name(i));}char *day_name(int n)static char *name[]="Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};return((n<1||n>7) ? name[0] : name[n]);}本例中定义了一个指针型函数day_name,它的返回值指向一个字符串 。该函数中定义了一个静态指针数组name 。name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示 。形参n表示与星期名所对应的整数 。在主函数中,把输入的整数i作为实参 , 在printf语句中调用day_name函数并把i值传送给形参n 。day_name函数中的return语句包含一个条件表达式,n值若大于7或小于1则把name[0]指针返回主函数输出出错提示字符串“Illegal day” 。否则返回主函数输出对应的星期名 。主函数中的第7行是个条件语句,其语义是,如输入为负数(i<0)则中止程序运行退出程序 。exit是一个库函数 , exit(1)表示发生错误后退出程序,exit(0)表示正常退出 。应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别 。如int(*p)()和int *p()是两个完全不同的量 。int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少 。int *p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号 。作为函数说明,在括号内最好写入形式参数 , 这样便于与变量说明区别 。对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分 。

    推荐阅读