指针函数和函数指针有什么区别? 1、指针函数,这两个概念都是简称,指针函数是指带指针的函数,即本质 是一个函数。我们知道函数都有返回类型(如果不返回值,则为无值型) ,只不 过指针函数返回类型是某一类型的指针。其定义格式如下所示: 返回类型标识符? *返回名称(形式参数表)? {? 函数体? }? 返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广 泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一 个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相 当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相 当于一个“变量” 。例如下面一个返回指针函数的例子: #i?nclude?? float?*find()?? main()? {? static?float?score[][4]?=?{{60,70,80,90},{56,89,34,45},{34,23,56,45}}?? float?*p?? int?i,m?? printf("Enter?the?number?to?be?found:")?? scanf("%d",&m)?? printf("the?score?of?NO.%d?are:\n",m)?? p?=?find(score,m)?? for(i =?0?i<4?i++)? printf("%5.2f\t",*(p+i))?? }? float?*find(float?(*pionter)[4],?int?n)/*定义指针函数*/? {? float?*pt?? pt?=?*(pionter+n)?? return(pt)?? } 学生学号从?0?号算起,函数?find(? )被定义为指针函数,形参?pointer?是指针 指向包含? 4? 个元素的一维数组的指针变量。pointer+1? 指向? score? 的第一行。? *(pointer+1)指向第一行的第?0?个元素。pt?是一个指针变量,它指向浮点型变量。? main()函数中调用?find()函数,将?score?数组的首地址传给?pointer。? 2、 “函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是 指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、 字符型、数组一样,这里是指向函数。如前所述,C?在编译时,每一个函数都有 一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针 变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一 样,在这些概念上一致的。 数据类型标志符 (*指针变量名) (参数) ; 注:函数括号中的参数可有可无,视情况而定。 下面的程序说明了函数指针调用函数的方法: #i?nclude?? int?max(int?x,int?y)? {? return(x>y?x:y)?? }? void?main(?)? {? int?(*ptr)(?)?? 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?是一个指针变量,不像函数名称那样是死 的,它可以指向任何函数,就看你像怎么做了。在程序中把哪个函数的地址赋 给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的 函数。 特别注意:指向函数的指针变量没有++和??运算,用时要小心。