请教C++中函数型指针和指针型函数的用法和区别,谢谢
函数指针:一种特殊的指针,他只能指向函数的入口地址,定义方法如下:
int (*p)(int,int); //定义一个函数指针p,只能指向返回值为int,形参为两个int的函数返回指针的函数:一个函数,他的返回值是指针,比如:
int *p(int,int);{ //函数体}这是一个形参为两个int类型,返回值是int型指针的函数
指针类型的函数是指: 这个函数的返回值是一个指针,也就是一个地址
指向函数的指针变量是指: 一个变量被定义为指针类型,它指向一个函数的地址。
简单的说,一个是函数,一个是指针
在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[]={ "Illegal day",
"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()只是函数头部分,一般还应该有函数体部分。
函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。
函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数。
函数指针的声明方法:
数据类型标志符 (指针变量名) (形参列表);
一般函数的声明为:
int func ( int x );
而一个函数指针的声明方法为:
int (*func) (int x);
前面的那个(*func)中括号是必要的,这会告诉编译器我们声明的是函数指针而不是声明一个具有返回型为指针的函数,后面的形参要视这个函数指针所指向的函数形参而定。
然而这样声明我们有时觉得非常繁琐,于是typedef可以派上用场了,我们也可以这样声明:
typedef int (*PF) (int x);
PF pf;
这样pf便是一个函数指针,方便了许多。当要使用函数指针来调用函数时,func(x)或者 (*fucn)(x) 就可以了,当然,函数指针也可以指向被重载的函数,编译器会为我们区分这些重载的函数从而使函数指针指向正确的函数。
例子:
复制代码
typedef void (*PFT) ( char ,int );
void bar(char ch, int i)
{
cout<<"bar "<<ch<<' '<<i<<endl;
return ;
}
PFT pft;
pft = bar;
pft('e',91);
复制代码
typedef void (*PFT) ( char ,int );
void bar(char ch, int i)
{
cout<<"bar "<<ch<<' '<<i<<endl;
return ;
}
void foo(char ch, int i, PFT pf)
{
pf(ch,i);
return ;
}
PFT pft;
pft = bar;
foo('e',12,pft);
复制代码
上述例子我们首先利用一个函数指针pft指向bar(),然后在foo()函数中使用pft指针来调用bar(),实现目的。将这个特点稍加利用,我们就可以构造出强大的程序,只需要同样的foo函数便可以实现对不同bar函数的调用。
C#中采用委托的方式,其实和C++的typedef非常相像,都是必须先定义一个类型,然后用该类型去声明一个变量。最大的不同在赋值阶段,C++只需要简单的将函数地址赋给指针,而C#必须用new声明一个对象,并且还要求相应的函数作为形参传入。在这个阶段,似乎C#显得更为复杂。到了调用阶段,C++和C#都可以容器后加个括号就能完成调用,但C++还多了一种*的方式。
简单的就是一个用指针去储存函数是函数型指针
而函数&形参为指针的是指针型函数
像函数型指针 :int (*s){int}; //用它去指向一个返回为INT函数 ,像int u(int s){}
然后把函数地址给*s,*s=u;
最后可以用s(5)就可以等于u(5);
而指针型函数,像void *s(char *s){}
就是了 。。。
函数型指针是指针,指向函数
int (*fp)();
指针型函数是函数,返回指针
int * pf();
C语言问题 初学请指教 一定采纳! 这里声明函数原型里的*是什么意思...
include<stdio.h>#include<string.h>char* upr(char s[]);\/\/函数upr返回的是一个char *类型的指针。int main(){ char s[]="Hello World!!!"; char *p=upr(s); printf("%s\\n",p); getchar(); return 0;}char* upr(char s[]){ int i=0; while(s[i]!
c语言 图形函数
模式, 可用下列图形初始化函数: void far initgraph(int far *gdriver, int far *gmode, char *path); 其中gdriver和gmode分别表示图形驱动器和模式, path是指图形驱动程序所 在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见表2。 图形驱动程序由Turbo C出版商提供, 文件扩展名为....
C语言,谁知道函数原型作用域是指什么
如果函数本身带static修饰,那么作用域是当前文件,从声明位置或者定义位置,到文件结尾。如果函数没有static,那么作用域为整个工程或者说是项目。
C语言中malloc函数的使用方法
功能:分配长度为num_bytes字节的内存块 注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。实例:include"stdio...
C语言中,函数值得类型可以省略,此时C语言默认函数值类型为( )A int...
A,这是c语言的特性,int是默认的返回值类型
在C语言程序中,func()是什么意思?
C语言程序中,func()指的是Function,表示子例程的一般性名词。在某些编程语言中,它指带返回值的子例程或语句。在一些编程语言中起着关键字的作用。将常用的代码以固定的格式封装(包装)成一个独立的模块,只要知道这个模块的名字就可以重复使用它,这个模块就叫做函数(Function)。函数的本质是一段...
在C语言函数中主调函数和被调函数分别是指函数中的哪个部分?函数的返 ...
include <stdio.h> int fun(void);int main(){ printf("%d",fun())return 0;} int fun(void)\/\/int 表示这个函数的返回值是整型的 { return 5;} 就fun与main函数来说main函数是主调函数,fun函数是被调函数, 因为fun在main函数中被调用,return 5;就是fun函数的返回值(返回一个5),...
C语言编程,要用子函数返回一个int型指针变量,比如说*a,应该怎么写返回r...
int *func( int n ){ int *a=(int *)malloc(sizeof(int)*n);return a ; \/\/直接返回指针变量就可以了!}
在C语言中,一个函数一般由两个部分组成,它们是——和——
在C语言中一个函数一般由两个部分组成一个是函数头,一个是函数体。函数体是编程语言中定义一个函数功能的所有代码组成的整体。函数体是用花括号括起来的若干语句,他们完成了一个函数的具体功能。函数体内的前面是定义和说明部分,后面是语句部分。函数声明与函数体放在一起组成了函数定义。函数头是指...
c语言中fread函数怎么用
c语言中fread函数语法为size_t fread( void *restrict buffer, size_t size, size_t count, FILE *restrict stream )。buffer是指向要读取的数组中首个对象的指针,size是每个对象的大小(单位是字节),count是要读取的对象个数,stream是输入流。通过fread函数可进行数据读取,返回成功读取的对象个数...
窄寒克痢: 1 函数指针变量 在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数.然后通过指针变量就可以找到并调用...
册亨县15296006083: C语言中,指针型函数和函数型指针的区别 - ?
窄寒克痢: 指针函数,本质上是一个函数,只是函数的返回值是一个指针,比如int *f() 函数指针,本质上是一个指针,只是指向的是一个函数,比如int (*f)()
册亨县15296006083: C++中指针函数和函数指针的概念和区别 - ?
窄寒克痢: 函数指针:一种特殊的指针,他只能指向函数的入口地址,定义方法如下: int (*p)(int,int); //定义一个函数指针p,只能指向返回值为int,形参为两个int的函数返回指针的函数:一个函数,他的返回值是指针,比如:int *p(int,int);{//函数体 }这是一个形参为两个int类型,返回值是int型指针的函数
册亨县15296006083: c++里的指针类型的函数和指向函数的指针变量有什么区别啊 - ?
窄寒克痢: 指针类型的函数是指: 这个函数的返回值是一个指针,也就是一个地址 指向函数的指针变量是指: 一个变量被定义为指针类型,它指向一个函数的地址.简单的说,一个是函数,一个是指针
册亨县15296006083: 函数指针和指针函数有什么区别???!?!? - ?
窄寒克痢: 前一个是个函数指针,如果有个函数是这样定义的 int pfunction( ) 那就可以用指针指向这个函数 p=pfunction; 然后调用时就可以这样用 p(); 后一个是指针函数,他的返回值是一个指向整型变量的指针,
册亨县15296006083: C/C++函数指针与指针函数等区别 - ?
窄寒克痢: 函数指针是指针,指向该函数入口地址的指针;指针函数是函数,返回指针类型的函数;
册亨县15296006083: VC++中的指针函数?
窄寒克痢: 指针函数就是指返回值是指针类型的函数,如: int* f(int a);或者char *f1(void);一个是返回值是整型指针变量的函数,一个是返回值为字符型指针变量的函数. 要和函数指针区别开来:int (*f)(int a);或者char (*f1)(void);
册亨县15296006083: 函数指针与指针的区别在哪里? - ?
窄寒克痢: 指针是C语言的一种数据类型;函数指针是C指针的一种.问“函数指针与指针的区别在哪里?” 说明LZ对指针还不慎了解.修改一下你的问题:“函数指针与整型指针的区别在哪里?”这样的话...
册亨县15296006083: 函数指针与指针函数的区别 - ?
窄寒克痢: 函数的指针:一个函数在编译时被分配的入口地址,是在计算机内存中的存储地址 函数指针:指向函数的指针,引用该指针可以引用这个函数进行运算 指针函数:函数返回指针型数据
册亨县15296006083: 请教C++中我看到有些函数定义成指针类型,定义成指针有什么意义用途呢? - ?
窄寒克痢: 指针函数是指带指针的函数,即本质是一个函数.我们知道函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针.其定义格式如下所示: 返回类型标识符 *返回名称(形式参数表) { 函数体 }返回类型...