c函数指针,C语言中指针函数和函数指针有什么区别

1 , C语言中指针函数和函数指针有什么区别指针函数:本质是一个函数,返回值是一个指针函数指针:本质是一个指针变量,该指针变量指向一个函数 。指针本质上其实是一个地址值,就像你的邮编一样 。你根据这个指针所代表的地址去送信,敲敲门,开门的是一个函数 , 那么就称这个指针为函数指针 。程序在编译时,每一个函数都有一个入口地址,这个入口地址就是函数指针所指向的地址
2,C 什么是函数指针它有什么用就是指向函数的指针类型 。函数指针是在C、C++实际项目深入应用的重要概念 。例在C程序设计中,多用于软件模块的通信分层、抽象思想等 。函数指针:指向函数的指针,可以将函数作为参数传递这个和C#中的委托是类似的 。函数指针就是一个指向某一类型函数的指针int (*p)(int,int); //p为指向返回int型,带两个int型参数的函数的指针int max(int a,int b){ return a
3,关于C语言中的指针指针是C语言的精髓?。?其主要作用有间接引用和动态分配 。间接引用时和引用的作用一样,就是对指针操作相当于对数据本身操作 。在传递函数参数的时候尤其有用,特别是参数是一个类类型的话 。因为函数是值传递,在传入实参时会有一个拷贝,用指针或引用可以克服这一浪费 。但是由于引用更加安全和简洁 , 在这一块推荐使用引用 。指针的另外一块就是对数组的操作了,数组本身是一组连续的存储单元,用指针加上偏移量的时候就可以实现方便访问了 。指针的最精髓的作用是内存动态分配,在构造链表和其他复杂的数据结构时功不可没 。如果你能很好的理解指针,你的c语言就能进入不同的阶级了 。至少你不再是初学者了 。至于例子不好举出,还是参考下教材吧 。我们的例子难以说明问题的 。通过指针访问它所指向的一个变量是以间接访问的形式进行的,所以比直接访问一个变量要费时间,而且不直观,因为通过指针要访问哪一个变量,取决于指针的值(即指向),例如\"*p2=*p1;\"实际上就是\"j=i;\",前者不仅速度慢而且目的不明 。但由于指针是变量,我们可以通过改变它们的指向, 以间接访问不同的变量,这给程序员带来灵活性,也使程序代码编写得更为简洁和有效 。指针变量可出现在表达式中, 设int x, y *px=&x;指针变量px指向整数x, 则*px可出现在x能出现的任何地方 。例如:y=*px+5; /*表示把x的内容加5并赋给y*/y=++*px; /*px的内容加上1之后赋给y [++*px相当于++(*px)]*/y=*px++; /*相当于y=*px; px++*/ 指针就相当于是一个地址 。首先,指针是指一个指向某一变量内存地址的一个指针变量(也算是一种变量,与普通变量不同的是,它是存放另一个变量的内存地址,也就是一个指针型的变量).其次,指针变量的值是存放的是另某个变量的内存地址.例如:int a=10;//假如a的内存地址为0x00000012(不定的)int *p;//定义一个指针变量p*p = &a;//把变量a的内存地址赋值给指针变量p,既p=0x00000012int b;//定将一个bb = *p; //即b值为p所指的内存地址的值,就是内存地址为0x00000012的值,相当于b=a;所以这里b=10简单的说 。指针就是地址 。就是一个存放地址的变量,,指针本身是整型的 。。但可以指向不同的数据类型的地址 。。。如int a=10,*p=&a;那么*p就是指针 。*只是一个标识符,说明后面的变量是存放地址的 。。所以p存放着a的地址,而*p就是10. 。。指针相当与房间的号码 , 指针指向的内容相当于房间里面的东西 。int a = 5;int *p = a;p指向a房子,a相当与房子,a里面的东西是5.记住这个就行了int a=0;int *p;//这个就是指针*p = &a; //&这个,就是取址记住这个,就OK了【c函数指针,C语言中指针函数和函数指针有什么区别】
4,C语言 指针函数 函数指针 什么区别联系最好有例子一定采纳搜指针函数 本质上是一个函数,只不过函数的返回值是指一个指针,比如定义 int *func(int );函数指针 本质上是一个指针,只不过指针指向的是一个函数,比如定义 int (*p2func)(int );b函数指针常见的例子就是:一个函数的函数名 。eg:intfun (int a, int b)return a + b}fun就可以叫做这个函数的函数指针 。当然,我们也可以自己定义一个函数指针变量指向fun 。eg:int (fp* ) (int ,int)(它定义格式有点奇怪 , 不过没办法) fp 就是一个int (*) (int, int) 类型的函数指针 。fp = fun;然后可以再其他函数里面调用了.假设int main (void)int sum = fd (1, 2);//等价于 int sum = fun (1, 2);printf ("sum = %d\n", sum);return 0;}void function ( void)这个函数的函数指针是function,如果我们想用一个函数指针来指向function,必须要类型一致,包括函数返回类型和 形参格式 。指针函数指的是函数返回值是个指针,本质是个函数 。eg:假设有一个数组intarr[length]int*function (int* arr, int length)int* tmp;sum = arr + 1;return sum;}这个返回值是指向arr[length] 第二个元素的地址 。大概就想到这些 。。没觉得指针函数这个概念有什么大的意义 。。。。可能其最大的意义就是拿过来和函数指针一起混淆初学者的视听吧 。指针函数指的是返回一个指针的函数,比如我们常见的gets(),strcpy() , strcat(),malloc()等等 。如果单独把它当成一个新概念真的没有什么意义 。这些函数除了返回一个指针之外没有任何共性,但是返回的指针又天差地远 。下面说说函数指针 。指针分为三种类型:对象指针,函数指针和void指针 。函数指针的声明形式是T (*p)(...),其中*p使用括号括起来的原因是函数类型解析的优先级高于指针的解析 , 故使用括号防止解析成上面的指针函数(其实这两个之间就相差了一对括号) 。函数指针可以绑定到与其返回值和参数类型都相同的函数上 。比如:int foo(int, double); // 函数声明int (*bar)(int, double) = foo; // 函数指针在上面的初始化中,写成&foo也是可以的 。函数指针的最大特点就在于,其不能做一元+-运算(当然也不能做+= -= ++ --等),且对其做一元*运算的结果还是其本身 。例如:(接着上面的例子)bar(1,1.0);(*bar)(1,1.0); // 两种情况等价甚至你还可以这样:(**************bar)(1,1.0);依然是对的 。所以实际应用中一般采取类似函数调用的方式,这样更加自然 。刚刚去测试了一下,还有一个更加隐蔽的问题:C中的函数可以采用使用原型或者不使用两种方式 。(不使用原型被视为过时)原型即在函数头中将参数类型及个数都声明,而不使用就是很简单的一对括号 。例如:int foo(); // 非原型int bar(void); // 原型int foo1(int); // 原型这有什么影响呢?看一看下面的一段代码:int foo(int i)int foo1(double c)int bar()int main(void) int (*foobar)(int); // 原型 int (*barfoo)(); // 非原型 foobar = foo; foobar = &foo; foobar = bar; foobar = foo1; // this barfoo = foo; barfoo = bar; barfoo = foo1; foobar(1); (*foobar)(1); (*************foobar)(1); return 0;}我的编译器对this指的一行进行了警告,提醒指针类型不匹配 。我们可以看到,非原型的函数指针可绑定到任意的函数上,而带有原型的函数指针在绑定时可以起到更严格的类型限制 。容易忽略的一点是,不接受任何参数的函数(带原型)的声明方式是int foo(void);,不应该省略void , 特别是在使用对应类型的函数指针时 , 如果省略void,那么错误的绑定也不会被警告 。我还注意到了一个现象:int foo(char);int (*bar)() = foo;这段代码同样也给了警告 。为什么呢?因为在不使用原型的情况下,char,short,float等会被隐式提升到与其对应的更高级类型 。而在这个绑定中 , bar是非原型,这时可能会进行整型提升,而foo带有原型,调用时不需要进行提升 。这样就有可能引发错误 。以上就是函数指针使用过程中需要注意的一点 。不过提醒LZ,函数指针使用过程中最好还是使用带有原型的函数指针 。5,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;//指向fun1p(2)//这时等价于fun1(2)p=fun2;//也可以指向fun2。。但是注意了,p=fun3;和p=fun4都是错误的,参数类型跟返回类型必须一样 。至于指针函数,就是返回一个指针的函数 。基本形式:int *fun(void);一般用法:int *fun(void);int main(void)int *p=NULL;//声明一个整型指针变量p=fun();//接收fun()的返回值。。在c语言中,指针被广泛使用,而函数指针是最为高级的用法之一,也是容易疑惑的地方之一 。看下面这段代码:#include void f(int a, int* output) { printf("a = %d\n", a); *output = a + 1; } typedef void (*func)(); int main() { func f = f; int ret = 0; f(3, &ret); printf("ret = %d\n", ret); return 0; } 上面看出 func 的类型是与f的类型不匹配的 , 这样可以通过编译吗? 答案是: 可以的 。由于在c语言中编译函数的时候 , 是仅仅将其函数名作为该函数的 唯一标识,为其分配相应地址 。所以虽然func 与 f的类型不一致 , 但是对于编译器看来 都是两个地址,是无所谓的 。用上面的特点,可以写出非常通用的函数指针类型,typedef int (*func)(); 这里之所有要有返回值,是用来标识该函数是否执行成功的错误代码标志 。随说做了有一段时间的c了,但尽然没有搞明白函数指针的用法,见到了也没有好好研究,今天终于有时间了,在网上搜了一下,终于弄懂了.原来就是定义了一个指针变量,只不过形式有点怪罢了.其实还是当成指针用就行了! 一般有两种用法: 1定义函数指针 int (*functionpoint)(int, int)----这只是定义了一个指向函数的指针 int a(int a,int b)----------------这是与之相符的函数原型 void main()-----------------------使用 { functionpoint = a;------------先赋值 functionpoint(1,2);----------调用 } 2用typedef定义使用 typedef int (*functionpoint)(int,int);----------定义了一种类型名为functionpoint的指针 int a(int a, int b)-----------------------------函数原型 void main() { functionpoint fun;---------------------------定义指针 fun = a;-------------------------------------赋值 fun(1,2);---------------------------------使用 } 函数就是这个函数的指针.函数指针是指向函数的指针变量 。因而“函数指针”本身首先应是指针变量 , 只不过该指针变量指向函数 。这正如用指针变量可指向整型变量、字符型、数组一样 , 这里是指向函数 。int func(int x); /* 声明一个函数 */int (*f) (int x); /* 声明一个函数指针 */f=func; /* 将func函数的首地址赋给指针f */赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址 。注2:函数括号中的形参可有可无,视情况而定 。下面的程序说明了函数指针调用函数的方法:例一、#include<stdio.h>int max(int x,int y)void main()int (*ptr)(int, int);int a,b,c;ptr=max;scanf("%d%d",&a,&b);c=(*ptr)(a,b);printf("a=%d,b=%d,max=%d",a,b,c);}ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了 。在程序中把哪个函数的地址赋给它,它就指向哪个函数 。而后用指针变量调用它,因此可以先后指向不同的函数 。不过注意,指向函数的指针变量没有++和--运算,用时要小心 。指针函数是指返回值是指针的函数,即本质是一个函数 。我们知道函数都有返回类型(如果不返回值,则为无值型) , 只不过指针函数返回类型是某一类型的指针 。其定义格式如下所示:返回类型标识符*返回名称(形式参数表)返回类型可以是任何基本类型和复合类型 。返回指针的函数的用途十分广泛 。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针 。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量” 。其实还是指针,只是指向的内容和声明方法不同而已

    推荐阅读