码迷,mamicode.com
首页 > 其他好文 > 详细

函数指针与指针函数

时间:2015-05-16 17:51:07      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:

在MOOK讨论区的一段回复代码中看到有用到指针函数

话说一直没怎么分清指针函数和函数指针,这次找些资料把它弄清楚~

Orz其实都是因为:“ * ” 的优先级低于 “ () ” 的优先级

函数指针

1、指向函数的指针变量

  注:C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数。

2、用途:调用函数、做函数的参数。

3、定义格式: 类型  (* 指针变量名)  ( 形参列表 );

  注:“形参列表”表示指针变量指向的函数所带的参数列表。

4、赋值:(例)

  int func(int x);    //声明一个函数

  int (*f) (int x);   //声明一个函数指针

  f=func;   //将func函数的首地址赋给指针f 
( 或者将函数地址赋给函数指针:f = &func; )

注:赋值时函数func不带括号,也不带参数。func代表函数的首地址,经赋值后,指针f就指向函数func()的入口。

综上eg.
#include<stdio.h>
int max(int x,int y){return (x>y? x:y);}
int 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);
    return 0;
}
  分析:ptr是指向函数的指针变量,把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数。实际上ptr和max都指向同一个入口地址,不同的是max是函数名(不能改变),而ptr是一个指针变量,它可以指向任何函数,在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。
  注:指向函数的指针变量没有++和 -- 运算

5、定义函数指针类型:typedef  int  (*Fun_ptr) (int,int);

   声明函数指针变量,并赋值: Fun_ptr maxFunc=max;

#include<stdio.h>
void function1()
{
  printf("function1\n");
}
void function2()
{
  printf("function2\n");
}
void main()
{
  typedef void(*Fun_ptr)();  //Fun_ptr 为指向函数的指针类型
  Fun_ptr pfun=function1;
  pfun();
  pfun=function2;  //赋给函数指针pfun的函数function2 应该和 函数指针所指函数
  pfun();       //的原型相一致:void function();
}

指针函数

1、返回值类型是指针的函数。

2、定义格式:类型*  函数名 ( 形参列表 );

 注:“()”表示这是一个函数,“ * ”表示此函数是以指针作为返回值的函数,返回的指针指向...类型的变量
eg.
#include <stdio.h>
float
* find(float(*pionter)[4],int n); //函数声明 int main(void) { 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-1); for(i=0;i<4;i++) printf("%5.2f\t",*(p+i)); return 0
; }

float* find(float(*pionter)[4],int n) //定义指针函数,pointer是一个指向数组的指针  { float *pt; pt=*(pionter+n);  //从数组 {60,70,80,90} 移动n次到数组 {34,23,56,45} return(pt); }

注:pointer是指向包含3个一维数组的指针变量。

 pointer+n指向score的第n+1行,*(pointer+1)指向第一行的第0个元素。

补充:指向数组的指针

用指针数组来代替多维数组,一个常见的用法就是处理字符串。

eg.

#include <cstdio> 
char *Names[]=
        {
             "Clare",
             "Paul",
             "Charles",
             "0"
        };

int main(int argc, char** argv)
{
        char **n=Names;
        while(*n!="0")     
        printf("%s\n",*n++);
        return 0;
}    

注:数组中的最后一个元素被初始化为 "0",while循环以次来判断是否到达数组末尾。

  

 

函数指针与指针函数

标签:

原文地址:http://www.cnblogs.com/claremore/p/4507233.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!