C语言调用函数指针

作者&投稿:巢骨 (若有异议请与网页底部的电邮联系)
在C语言中,指向函数的指针怎么调用函数?~

1楼感觉对函数指针不是很了解,就不评论了. 2楼的基本还可以,但是int (*p)(),然后让它指向max函数,一个包含两个未知量的函数,这在后来的标准c里面是不支持的好像. 3楼吧,那么多*,感觉有点不大对. *是取内容,连着那么* ,我没试过,没有多少意义至少.他11级了,应该也不会怎么有错,你可以试试(我不打算加那么多*, 就不调试了).
程序里面对函数的调用,就是通过函数的入口地址,然转入函数. 这样的话,函数指针的意义就明显了.函数指针指向了函数的入口,即函数指针里是函数的入口地址. 指针不能指向函数这种说法肯定是不对的.话说回来,1楼的老兄可能看错书了,或者记错了.
类型匹配很重要,二楼的声明和使用不一致,这在老版的编译器里也是支持的.那时候ANSI标准还没有制定出来.现在而言,这种定义应该不被支持了才是.
那个声明应该如下:
int (*p)(int , int);
这样才能指向
int name(int,int)型的函数.么有实验过,但按这种写法是不错的肯定.
三楼那个********p,怎么都觉得不对.

#include
//定义类型fun_ptr,它是一个函数指针,指向的函数返回值为int,参数为int
typedef int (*fun_ptr)(int);

//fun1
int fun1(int a)
{
printf("call fun1,pram=%d,return %d+1
", a, a);
return a+1;
}
//fun2
int fun2(int a)
{
printf("call fun2,pram=%d,return %d+2
", a, a);
return a+2;
}

int main(int argc, char *argv[])
{
int a = 10;
int s = 0;
//定义函数指针类型的变量p_fun
fun_ptr p_fun;
//指向fun1
p_fun = fun1;
//执行
s=p_fun(a);
printf("s=%d
", s);

//指向fun2
p_fun = fun2;
//执行
s=p_fun(a);
printf("s=%d
", s);

return 0;
}
执行结果:

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

你的程序中子程序采用的不是指针类型参数,这样子程序无法将交换过后的值传回来。



不好的编码规范。
函数声明最好在main函数的前面。

老师的代码定义的swap函数传入的形参是指针变量,是固定的4个字节,比你的代码传值 程序运行更快。
函数只用来实现相应功能,这样才可以实现代码复用,不要在里面写输出语句,这样代码会大大减少复用性。

首先函数声明放在main函数外,
其次zhizhen调用时,括号内不加*
最后指针函数内部,你的是传入值,你老师的是传入指针
你的zhizhen函数实际上不会交换 ab值,因为传值是传入副本
只有传入指针才会交换

你的程序实现不了交换的功能,因为:
void zhizhen(int a,int b)
传递的参数int a,int b为值传递,也就是系统会用两个临时变量承载你传递的变量的值,而不会把变量本身传递过去,也就是在函数中的交换行为无法传递到函数调用处。
解决方法有两个,
其一:使用指针,就是你老师的方法
其二:使用引用,也可以实现

一些建议:

  1. zhizhen函数声明应该放在main()外面,并且是在main()前面,因为C语言是顺序执行,执行main()前它必须要知道zhizhen这个函数已经存在;

  2. 实际上你的zhizhen函数执行完了,a和b并不会交换。因为参数不是指针时,传入的只是一个值,是一个副本,对于main里的ab并没有影响,而你这个看起来结果相同是因为你的输出printf写在了zhizhen里。一般学习指针就是要让你知道指针对外部的影响。

  3. 尽量不要用拼音作为函数名,变量名。

  4. 指针还需要继续加深,数据都是存储在内存中,指针*p取的是里面的数据,就是值,而指针的地址就是p是取的地址。




C语言 函数指针调用时加星号与不加星号都行是为什么?
我纵观你正在学的知识点,悄悄告诉你一个规律。你是否发现在调用的时候一般是没有*号的。比如swap(p1,p2);(这里是引用函数,不是定义函数)。比如for中和scanf中的p++ 再比如数组赋值:p=a(这里的a是数组首地址)像printf和定义指针,一般是*p 请你细细理解,好好品味。我只是心血来潮答个题。

为什么C语言函数传参数的时候要传指针?
代码在编译时会出现 error C2664: 'InsertSort' : cannot convert parameter 1 from 'int' to 'int []'这是因为用数组名做函数实参时,向形参(数组名或指针变量)传递的是数组首元素地址,因此对参数的类型做一下改变,如下图所示:

C语言指针对FUN函数调用
b也是函数指针,但是参数是空的。w是int数组,c是整型变量。A: a本身是函数指针, 而函数指针的返回值是int,类型不匹配。B: *a和a是一样的, &c是int *型,参数类型符合。所以 这个是合法调用。C: b指向的函数指针是无参的,所以b(w)是错的。D: fun要求的是int *参数,而b是函数指针...

c语言 函数调用 swap函数 一定要用指针吗
不一定。void swap(int a,int b){ int t;t=a;a=b;b=t;} 这样写,只是传了一份拷贝给a,b,交换好后,栈清空,没有传回给你原来所要交换的数。而printf放里面可以是因为你的那份拷贝(即a,b)的值是跟你要交换的数一样的,所以行得通。不用指针的方法就是:void swap(int &a,int ...

C语言调用函数互换ab,为什么要用指针。不用指针能行吗?注意,是调用函 ...
这是 C 语言 本身 特性 规定了 的。你只要记住 这点: 形参 必须用指针,这样才能把 通过 函数加工 后的 数值 带回来。通过函数 互换后 的a,b,才能被带回。至于“为什么”,可以不去追究,它的理由 无非 是什么 地址啦,值啦之类,时间长了,自己会记混淆。其它语言,例如 fortran 语言,...

C语言中,调用函数的实参是数组名,被调用函数的形参可不可以是指针
可以。是数组也行,如:void f1(int a[]){ } void f2(int *p){ } int a[]={1,2,3};f1(a);f2(a);

C语言指针调用函数问题,急求解释(本题是《c和指针》上的题目)_百度知 ...
首先数组名作为参数传递,无论形参定义是指针还是数组(int *columns 和 int columns[ ]效果是一样的),最终都是传地址。二、数组形参定义char const *,修饰符const表示常量不可修改,这里const修饰的是*input,表示数组指针指向的地址内容不能修改,但是数组指针本身值可以修改。也就是说函数中可以改变...

c语言中的指针问题,以及子函数的调用
第一个是在根据指针, 交换指针所指的数据 第二个虽然写的使用"指针"在实现, 实际上, 他是在奖p1 和p2两个本地的变量值进行交换, 而并不是奖两个地址所指向的内存单元进行交换 第二个函数你如果吧所有的int * 都改成int, 就能更清楚的看到他到底在干嘛了 ...

C语言 调用指针函数 没用
因为exchange是按值传递的,e ,f ,g传的是值的一份拷贝,虽然fun确实修改了拷贝的值,但是还是没有修改main函数中的值,,,如果要有用可以改成:include<stdio.h> int fun(int *a,int *b){ int temp;temp=*a;a=*b;b=temp;return 0;} int exchange(int *a,int *b,int *c){ if(...

c++的函数指针是怎么用的呀?
如有如下的函数:int fn1(int x, int y); int fn2(int x);定义如下的函数指针:int (*p1)(int a, int b); int (*p2)(int a);则 p1 = fn1; \/\/正确 p2 = fn2; \/\/正确 p1 = fn2; \/\/产生编译错误 6) 定义了一个函数指针并让它指向了一个函数后,对函数的调用可以通过函数...

喀喇沁左翼蒙古族自治县13044081741: 在C语言中,指向函数的指针怎么调用函数? -
熊蓝托吡: 如果存在函数指针p,以*p取函数指针的值,然后加上参数列表调用即可. 即 ret = (*p)(arg_list); 如,p为int (*)(int)类型的函数指针,那么 int a = (*p)(10); 这样就是一次典型的函数指针调用.

喀喇沁左翼蒙古族自治县13044081741: 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 . .但...

喀喇沁左翼蒙古族自治县13044081741: C语言——指向函数的指针 -
熊蓝托吡: c语言中叫做回调函数,将函数指针(如max)作为函数的参数,函数(如fun)中调用这个参数指向的函数,调用函数(fun)时看情况而给函数传入不同的函数指针 例如fun(a,b,min),那么fun函数调用执行三个参数就调用min函数 参数的定义要与传入的函数指针相匹配 例如fun(int,x,int y,(*p)(int,int)) 那么调用fun(a,b,min)时,min的参数必须是(int ,int)

喀喇沁左翼蒙古族自治县13044081741: 在C语言中如何调用双指针函数? -
熊蓝托吡: 传值给二级指针,需要先定义一个一级指针变量,再把这个指针变量的地址传进去.如:int *pBigger= &bigger; max( &x, &y, &pBigger); 不能写成:max( &x, &y, &(&bigger) )&(&bigger)理解上是取两次地址,但&bigger是取地址并不会返回一个此地址的变量(指针变量);

喀喇沁左翼蒙古族自治县13044081741: C语言 函数指针 的调用问题?函数指针 怎么用?最好有例子.. -
熊蓝托吡: 有函数: int fun(int a,int b); 要定义指向该函数的指针 对比指向 int a; 的指针 int *p; p = &a; p的定义是怎么来的?首先要保证p是一个指针类型 写下(*p),然后,考虑下p的基类型,p的基类型就是变量a的类型int 将int 放在(*p)前面就行了 ...

喀喇沁左翼蒙古族自治县13044081741: 关于C语言中指向函数的指针的调用问题 -
熊蓝托吡: 两种方式,在某些环境下是等效的,但是个人建议使用m=(*p)(a)这种方式,表意明确 说是等效的原因是实际上函数名也只是一个地址而已 但是要注意的是,m=p(a)这样的写法【据说】某些编译器认为是错误的表达式,会导致编译错误(但是同时,如果lz看书比较仔细的话,可能会在经典书籍<Pointers on C>一书中见到说两种表示都是合理的[中文版P261],所以我之前强调了是"据说",事实上,我到今天所用过的所有C编译器都支持两种表示方式;但是我们再回到经典中的经典<The C Programming Language>中使用的函数指针都是m=(*p)(a)这种方式[5.11 指向函数的指针])

喀喇沁左翼蒙古族自治县13044081741: 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...

喀喇沁左翼蒙古族自治县13044081741: 51单片机中,指针函数 在C语言程序 如何使用? -
熊蓝托吡: 你好,比较方便的实现方式是在函数的外部申请数组;在调用函数的时候传入数组的地址进行操作.如果一定要在子函数内部申请空间并返回地址,那么需要在子函数内部动态申请内存空间.具体的方法一般是使用标准库中的malloc函数.对于c51函数库,参考这个链接:http://www.keil.com/support/man/docs/c51/c51_malloc.htm

喀喇沁左翼蒙古族自治县13044081741: 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","...

喀喇沁左翼蒙古族自治县13044081741: c语言中,要用函数直接调用就好啦.为什么还要用指针??? -
熊蓝托吡: 函数名,其实在汇编一级是地址,指针里存得也是地址,两者没啥区别,但在我们编译的时候,由于编译器要对参数进行类型检查,所以直接调用函数用起来比较方便,而指针这需要定义成指向函数的指针,才能通过编译器的类型检查.为什么要用指针?有许多的WINDOWS API是回调函数,需要函数指针.

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