函数指针怎么调用

作者&投稿:少垂 (若有异议请与网页底部的电邮联系)
带指针的函数怎么调用?~

什么叫带指针的函数?说清楚点嘛?
1.如果是返回值是指针
char* getname()
{
char* pname=new char[23]; //返回指针必须是函数释放后并未释放的内存空间,
cout<<"input your name:
"; //一般返回两种情况,一是在函数中像该函数一样动态分配堆内存
cin.getline(pname,22); //二是返回指针指向参数中地址,如: int* max(int a,int b) { return &a; }
pname[22]='\0';
return pname;
}
int main()
{
char* name=getname();
cout<<"your name is: "<<name<<endl;
delete []name; //记得动态释放分配内存
return 0;
}
2.参数是指针类型
常见的是通过指针或引用交换两个数的值
void swa(int* p1,int* p2)
{
int temp=*p1; *p1=*p2; *p2=temp;
}
int main()
{
int a=2,b=3;
swa(&a,&b); //传递地址
return 0;
}
附解:你可以把指针看做是一种复合类型,它之所以可以修改参数值,本质是因为
对指针解除引用*p形式是操作的参数所存数据内存空间,但如果它不解除引用,它
并不会修改参数的值:如
void swa(int* p1,int* p2) //函数意思是最初始在函数参数块中定义两个指针p1,p2,使
{ //p1指向a,p2指向b,下面函数体只是使指针指向地址改变,成了
//p1指向b,p2指向a。但并未对a,b内存空间操作,当函数调用结束后,指针p1,p2
//也释放了,所以并未起任何作用
int* temp;
temp=p1; p1=p2; p2=temp;
}
int main()
{
int a=2,b=3;
swa(&a,&b); //传递地址
cout<<a<<" "<<b;
return 0;
}
这个函数并不会交换a,b的值

直接用函数名调用可读性好一点,如果想写一个通用一点的方法来处理不同的函数,则调用不同函数的地方需要多次类似重复地使用不同的函数去调用。函数指针就可以避免这个问题,不管是普通调用或者是形参,只要参数类型和返回值一致即可,不必重复使用函数名,尤其是函数指针数组更是使用得广泛,比如虚函数表就是这样一个函数指针数组。

1、首先打开vs2014,新建一个项目。

2、添加头文件。

3、添加main主函数。

4、定义一个函数addTwoNumbers。

5、将addTwoNumbers函数地址赋值给ptr_sum。

6、调用函数指针求和。

7、运行程序,看看结果。

注意事项:

 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。



函数指针的使用过程包含三个步骤:
1、定义一个函数指针;
2、将函数指针指向一个函数;
3、调用这个函数指针所指向的函数。
下面给一个例子加以说明:
int add(int one, int another)
{
return one + another;
}

int sub(int one, int another)
{
return one - another;
}

int rev(int n)
{
return -n;
}
// 先定义3个函数,分别完成加法、减法和求相反数。这样只是为了说明问题的方便。
void main(void)
{
int result;
int (*p)(); // 这样定义指向函数的指针
// 应说明如下问题:
// 1、这里的()绝对不能少;
// 2、前面的int类型应该和这个指针未来要指向的函数的返回值类型保证一致。
p = add;
// 这个操作是最需要说明的。
//1、add是函数名称;
//2、函数名称本质上是一个函数的入口地址常量,或者换句话说,函数名称是指向函数的指针常量(函数名称实质上是这个函数的代码和数据在内存中的首地址);
//3、将函数名称赋值给一个函数指针,就实现了将一个函数指针指向这个函数的作用。实际上,这时的指针变量里存储的就是那个函数的第一条指令的地址。
result = p(3, 4); // 也可以写成:result = (*p)(3, 4);
// 这里依然有几个问题需要说明:
// 有初学者对这里很不理解,认为p是指针名称,不是函数名称,怎么能调用add()函数呢?实际上,问题是这样的:
// “XXXX(...)”这种形式的内容被C语言编译系统这样理解:
// 要调用一个函数,而且这个函数的首地址由XXXX确定;对应的汇编指令主要是:CALL XXXX
// 由于p的值就是函数首地址(函数第一条指令的地址),因此,p()就是在调用地址值为p的值的函数。
p = sub; // 让p指向sub()函数
result = p(6, 2); // 调用sub()函数
p = rev; // 让p指向rev()函数
result = p(5); // 调用rev()函数
}

一般需要定义一个函数指针类型

typedef int (*function_pointer_t) ( int arg1, int arg2 );

然后,定义函数指针变量

function_pointer_t fp_invoker = 0;

函数指针可以动态改变内容,改变调用对象,假设有两个函数

int function_sum( int arg1, int arg2 )
{
    return arg1+arg2;
}
int function_sub( int arg1, int arg2 )
{
    return arg1-arg2;
}

注意到两个函数的原型与函数指针类型是一致的。以下是调用

fp_invoker = function_sum; // 直接用函数名赋值即可
fp_invoker(1,2);           // 调用时,可以认为函数指针便是函数名,此时调用加法
fp_invoker = function_sub; // 同理,切换到减法
fp_invoker(1,2);           // 调用减法

以上都是直观的用法,通常函数指针用于回调,即下层函数先将函数指针内容保存起来,处理结束后,再调用。此时要注意首先检查函数指针内容是否为空。

if( fp_invoker ){
    fp_invoker( arg1, arg2 );
}


  函数指针是通过函数名及有关参数进行调用的。
  与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。
  由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步:
  首先,要说明函数指针变量。例如:int (*f)(int x);
  其次,要对函数指针变量赋值。例如: f=func; (func(x)必须先要有定义);
  最后,要用 (*指针变量)(参数表),调用函数。例如: (*f)(x);(x必须先赋值)。
  【例】任意输入n个数,找出其中最大数,并且输出最大数值。

main()

{

int f();

int i,a,b;

int (*p)(); /* 定义函数指针 */

scanf("%d",&a);

p=f; /* 给函数指针p赋值,使它指向函数f */

for(i=1;i<9;i++)

{
scanf("%d",&b);

a=(*p)(a,b); /* 通过指针p调用函数f */

}

printf("The Max Number is:%d",a)

}

f(int x,int y)

{

int z;

z=(x>y)?x:y;

return(z);

}

运行结果为:

343 -45 4389 4235 1 -534 988 555 789↙

The Max Number is:4389

【指针函数】

一个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。返回指针的函数,一般定义格式为:
类型标识符 *函数名(参数表)

int *f(x,y);

其中x,y是形式参数,f是函数名,调用后返回一个指向整型数据的地址指针。f(x,y)是函数,其值是指针。

如:char *ch();表示的就是一个返回字符型指针的函数,请看下面的例题:

【例】将字符串1(str1)复制到字符串2(str2),并输出字符串2.

#include "stdio.h"

main()

{

char *ch(char *,char *);

char str1[]="I am glad to meet you!";

char str2[]="Welcom to study C!";

printf("%s",ch(str1,str2));

}

char *ch(char *str1,char *str2)

{

int i;

char *p;

p=str2

if(*str2==NULL) exit(-1);

do

{

*str2=*str1;

str1++;

str2++;

}while(*str1!=NULL);

return(p);

}

通过分析可得:

函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,

函数指针可以用来指向一个函数。


c语言 指向数组的函数指针是怎么调用的啊,就是在main里面怎么写
你说的“指向数组的函数指针”,是指 指针指向数组,数组是由函数指针构成,是不是这样?

C语言中函数指针用法
函数在内存中有一个物理位置,而这个位置是可以赋给一个指针的。一零点函数的地址就是该函数的入口点。因此,函数指针可被用来调用一个函数。函数的地址是用不带任何括号或参数的函数名来得到的。(这很类似于数组地址的得到方法,即,在只有数组名而无下标是就得到数组地址。)怎样说明一个函数指针变量...

带指针的函数怎么调用?
\\x0d\\x0a delete []name; \/\/记得动态释放分配内存\\x0d\\x0a return 0;\\x0d\\x0a}\\x0d\\x0a2.参数是指针类型\\x0d\\x0a常见的是通过指针或引用交换两个数的值\\x0d\\x0avoid swa(int* p1,int* p2)\\x0d\\x0a{\\x0d\\x0a int temp=*p1; *p1=*p2; *p2=temp;\\x0d\\x0a...

C语言调用函数指针
并不是不规范的问题,你子程序写法只能在子程序中输出正确的数据,而在主函数中无法得到交换过的x和y的值。参考程序运用指针让子程序去读写a和b的值,在子程序执行完成后,a和b的值确实得到了交换。你的程序中子程序采用的不是指针类型参数,这样子程序无法将交换过后的值传回来。

函数指针和指针函数详解
由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步:首先,要说明函数指针变量。例如:int (*f)(int x);其次,要对函数指针变量赋值。例如: f=func; (func(x)必须先要有定义)最后,要用 (*指针变量)(参数表)...

C语言函数指针调用问题
include"stdio.h"void sub(int* c,int* d,int* p,int* q){ int i,j;i=(*c)*(*c);j=(*d)*(*d);c=i*j;d=(i-j);p=i+j;q=i-j;} void main(){ int i=3,j=4,k,s;void sub(int*,int*,int*,int*); \/\/参数表少个逗号,可以把这一行删掉,因为sub函数是在main...

如何通过函数指针调用函数
一般需要定义一个函数指针类型 typedef int (*function_pointer_t) ( int arg1, int arg2 );然后,定义函数指针变量 function_pointer_t fp_invoker = 0;函数指针可以动态改变内容,改变调用对象,假设有两个函数 int function_sum( int arg1, int arg2 ){ return arg1+arg2;} int function_sub...

C#调用C++的dll中的函数,数组指针的问题
其实在.net开发中确实存在第三种类型——指针。但仅限于unsafe开发时使用!对于dll调用问题,如果是pe格式的dll考虑使用PInvoke(平台调用)。而平台调用跟具体的unsafe开发是没有任何关联的,并不是说平台调用一定会用到非安全开发!由于.net本身隐藏了指针的使用,你不必要再去开辟任何指针了!所以这里显然...

C# 怎样取数组变量的指针??
呵呵,刚一时兴起,给你做了个例子。在mvc里写的代码,在页面上输出的。页面上输出保存在ViewBag里的指针数组的数据。数据是str拼接的。

怎么用指针法实现交换两个变量的值,并在主函数中调用?
{ int t;t=*p1; *p1=*p2; *p2=t; \/\/交换p1和p2所指向的内容 } void main(){int a,b;int *pointer_1, *pointer_2;printf("请输入两个数字:\\n");scanf("%d%d",&a,&b);pointer_1=&a;pointer_2=&b;swap(pointer_1,pointer_2); \/\/函数调用,指针作为实参...

云阳县15550993208: 在C语言中,指向函数的指针怎么调用函数? -
恭谈健拓: 如果存在函数指针p,以*p取函数指针的值,然后加上参数列表调用即可. 即 ret = (*p)(arg_list); 如,p为int (*)(int)类型的函数指针,那么 int a = (*p)(10); 这样就是一次典型的函数指针调用.

云阳县15550993208: C语言中的函数指针 -
恭谈健拓: 函数指针是定义一个指向函数的指针,形式为:void (*p)(void); 一般用法:int fun1(int x); int fun2(int x); char fun3(int x); int fun4(char x); int main(void) { int (*p)(int x);p=fun1; //指向fun1 p(2) //这时等价于fun1(2) p=fun2; //也可以指向fun2 . .但...

云阳县15550993208: C语言中函数指针用法 -
恭谈健拓: 在C语言中,指针被广泛使用,而函数指针是最为高级的用法之一,也是容易疑惑的地方之一. 看下面这段代码: #include <stdio.h> void F(int a, int* output) { printf("a = %d\n", a);*output = a + 1; } typedef void (*FUNC)(); int main() { FUNC f = F;...

云阳县15550993208: 函数调用(函数指针) -
恭谈健拓: 一般需要定义一个函数指针类型 typedef int (*function_pointer_t) ( int arg1, int arg2 );然后,定义函数指针变量 function_pointer_t fp_invoker = 0;函数指针可以动态改变内容,改变调用对象,假设有两个函数 int function_sum( int arg1, int arg2 )...

云阳县15550993208: C语言 函数指针 的调用问题?函数指针 怎么用?最好有例子.. -
恭谈健拓: 有函数: int fun(int a,int b); 要定义指向该函数的指针 对比指向 int a; 的指针 int *p; p = &a; p的定义是怎么来的?首先要保证p是一个指针类型 写下(*p),然后,考虑下p的基类型,p的基类型就是变量a的类型int 将int 放在(*p)前面就行了 ...

云阳县15550993208: 用普通指针怎样调用函数 -
恭谈健拓: 调用函数 需要使用 函数指针啊,函数指针是指向函数的指针变量. 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数.函数指针的声明方法为:函数类型 (标志符指针变量名) (形参列表); 注1:“函数类型”说明函数...

云阳县15550993208: C语言 怎么调用指针数组函数
恭谈健拓: #include<stdio.h>#include<string.h> void paixu(char **a) {int i,j;char *p;for(i=0;i<5;i++){for(j=0;j<4-i;j++){if(strcmp(a[j],a[j+1])>0){p=a[j];a[j]=a[j+1];a[j+1]=p;}}} } void main() {char *a[]={"Hongkong","Singgapore","Beijing","...

云阳县15550993208: 如何用指针调用对象函数 -
恭谈健拓: 在释放指针p后是要将指针p赋一个空值,避免成为一个野指针

云阳县15550993208: C语言指向函数的指针的调用 -
恭谈健拓: #include<stdio.h>int *d_bubblesort(int a[],int n)//数组长度为n的冒泡降序排序 { int i,j; int temp; for(i=0;i<n;i++) { for(j=n-1;j>i;j--) { if(a[j]>a[j-1]) { temp=a[j-1]; a[j-1]=a[j]; a[j]=temp; }} } return a; }void main() { int i; int *p=NULL; int a[10]={6,5,4,1,2,3,9,8,7...

云阳县15550993208: 函数指针的赋值与调用? -
恭谈健拓: 第一个问题,两个都是可以的.函数名是一个地址,可以将他赋值给一个指向函数的指针.前面加了&符号其意义是一样的.比如定义一个数组arr[],arr表示这个数组的首地址,但&arr同样表示他的首地址.这些都是设计语言时这样规定的 第二个问题也是这样,比如你定义一个字符串指针char *str, 输出str 他并不是输出了地址,而是输出存在该地址的值,所有这些设计都是为了方便使用,而不是为了符合同一个规则

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网