CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  新手乐园

函数指针问题!

楼主demper(好好利用时间干点有意义的事!)2006-10-23 22:57:52 在 C/C++ / 新手乐园 提问

#include<iostream>  
  using   namespace   std;  
  int   sum(int   *);  
  main()  
  {  
  int(*fptr)(int   inum);  
  int   inumber=10;  
  fptr=sum;//编译时为什么会在这里出错  
  sum(&inumber);  
  (*fptr)(&inumber);  
  cout<<"inumber="<<inumber<<endl;    
  system("pause");  
  return   0;  
  }  
  int   sum(int   *inum)  
  {*inum=*inum+1;  
    return   *inum;  
  }    
  问题点数:10、回复次数:6Top

1 楼Kusk(Kusk)回复于 2006-10-23 23:07:38 得分 5

呵呵,参数没有一致:  
   
  int(*fptr)(int   inum);  
   
  应改为  
  ------->  
   
  int   (*fptr)(int   *inum);  
   
   
  Top

2 楼mstlq(面色铁路桥)回复于 2006-10-24 00:12:27 得分 0

int   sum(int   *);  
  与  
  int(*fptr)(int   inum);  
   
  不匹配Top

3 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-10-24 08:17:33 得分 0

函数指针声明的要和指向的函数地址是相同类型  
   
  否则估计编译都通不过Top

4 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-10-24 08:32:06 得分 5

函数指针变量-   -  
   
                                                                               
   
  函数指针变量    
   
    在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  
   
  函数指针变量  
   
  函数指针变量    
   
    在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); 调用函数的一般形式为:   (*指针变量名)   (实参表)使用函数指针变量还应注意以下两点:    
   
  a.   函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。    
   
  b.   函数调用中"(*指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。    
   
  指针型函数    
   
  前面我们介绍过,所谓函数类型是指函数返回值的类型。   在C语言中允许一个函数的返回值是一个指针(即地址),   这种返回指针值的函数称为指针型函数。    
  定义指针型函数的一般形式为:      
  类型说明符   *函数名(形参表)      
  {      
  ......   /*函数体*/    
  }      
  其中函数名之前加了"*"号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。    
  如:    
  int   *ap(int   x,int   y)    
  {    
  ......   /*函数体*/    
  }    
    表示ap是一个返回指针值的指针型函数,   它返回的指针指向一个整型变量。下例中定义了一个指针型函数   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()只是函数头部分,一般还应该有函数体部分。    
  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_n  
   
  ame(int   n){    
  static   char   *name[]={   "Illegal   day",    
  "Monday",    
  "Tuesday",    
  "Wednesday",    
  "Thursday",    
  "Friday",    
  "Saturday",    
  "Sunday"};    
  return((n<1||n>7)   ?   name[0]   :   name[n]);    
  }    
    本程序是通过指针函数,输入一个1~7之间的整数,   输出对应的星期名。指针数组的说明与使用一个数组的元素值为指针则是指针数组。   指针数组是一组有序的指针的集合。   指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。    
    指针数组说明的一般形式为:   类型说明符*数组名[数组长度]      
    其中类型说明符为指针值所指向的变量的类型。例如:   int   *pa[3]   表示pa是一个指针数组,它有三个数组元素,   每个元素值都是一个指针,指向整型变量。通常可用一个指针数组来指向一个二维数组。   指针数组中的每个元素被赋予二维数组每一行的首地址,   因此也可理解为指向一个一维数组。图6—   6表示了这种关系。    
  int   a[3][3]={1,2,3,4,5,6,7,8,9};    
  int   *pa[3]={a[0],a[1],a[2]};    
  int   *p=a[0];    
  main(){    
  int   i;    
  for(i=0;i<3;i++)    
  printf("%d,%d,%d\n",a[i][2-i],*a[i],*(*(a+i)+i));    
  for(i=0;i<3;i++)    
  printf("%d,%d,%d\n",*pa[i],p[i],*(p+i));    
  }    
    本例程序中,pa是一个指针数组,三个元素分别指向二维数组a的各行。然后用循环语句输出指定的数组元素。其中*a[i]表示i行0列元素值;*(*   (a+i)+i)表示i行i列的元素值;*pa[i]表示i行0列元素值;由于p与a[0]相同,故p[i]表示0行i列的值;*(p+i)表示0行i列的值。读者可仔细领会元素值的各种不同的表示方法。   应该注意指针数组和二维数组指针变量的区别。   这两者虽然都可用来表示二维数组,但是其表示方法和意义是不同的。Top

5 楼chenjun799()回复于 2006-10-24 09:04:35 得分 0

对,参数类型不符!Top

6 楼lingkeylbh(凌可)回复于 2006-10-25 10:01:04 得分 0

markTop

相关问题

关键词

得分解答快速导航

  • 帖主:demper
  • Kusk
  • wanfustudio

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo