C语言------指针(三)


函数指针变量

   

    在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) 函数调用中"(*指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。

 

 

指针型函数

 

    所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。

    定义指针型函数的一般形式为:

类型说明符 *函数名(形参表)  
{  

        ……          /*函数体*/
 }  

   其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。

    如:

int *ap(int x,int y)
{

      ......       /*函数体*/
}

    表示

    ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。

<span style="font-size:18px;">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[]={ "Illegal day",
                        "Monday",
                        "Tuesday",
                        "Wednesday",
                        "Thursday",
                        "Friday",
                        "Saturday",
                        "Sunday"};
  return((n<1||n>7) ? name[0] : name[n]);
}

</span>

     本例中定义了一个指针型函数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()只是函数头部分,一般还应该有函数体部分。

 

 

有关指针的数据类型和指针运算的小结

 

定义

含    义

int i;

定义整型变量i

int *p

p为指向整型数据的指针变量

int a[n];

定义整型数组a,它有n个元素

int *p[n];

定义指针数组p,它由n个指向整型数据的指针元素组成

int (*p)[n];

p为指向含n个元素的一维数组的指针变量

int f();

f为带回整型函数值的函数

int *p();

p为带回一个指针的函数,该指针指向整型数据

int (*p)();

p为指向函数的指针,该函数返回一个整型值

int **p;

P是一个指针变量,它指向一个指向整型数据的指针变量

 

 

   现把全部指针运算列出如下:

    1)指针变量加(减)一个整数:

    例如:p++、p--、p+i、p-i、p+=i、p-=i

    一个指针变量加(减)一个整数并不是简单地将原值加(减)一个整数,而是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数加(减)。

    2)指针变量赋值:将一个变量的地址赋给一个指针变量。

      p=&a;        (将变量a的地址赋给p)

      p=array;      (将数组array的首地址赋给p)

      p=&array[i];   (将数组array第i个元素的地址赋给p)

      p=max;       (max为已定义的函数,将max的入口地址赋给p)

      p1=p2;        (p1和p2都是指针变量,将p2的值赋给p1)

      注意:不能如下:

      p=1000;

      3)指针变量可以有空值,即该指针变量不指向任何变量:

          p=NULL;

      4)两个指针变量可以相减:如果两个指针变量指向同一个数组的元素

        则两个指针变量值之差是两个指针之间的元素个数。

      5)两个指针变量比较:如果两个指针变量指向同一个数组的元素,则两个指针变量可以进行比较。

        指向前面的元素的指针变量“小于” 指向后面的元素的指针变量。

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值