没觉得指针函数这个概念有什么大的意义。。。。可能其最大的意义就是拿过来和函数指针一起混淆初学者的视听吧。
指针函数指的是返回一个指针的函数,比如我们常见的gets(),strcpy(),strcat(),malloc()等等。如果单独把它当成一个新概念真的没有什么意义。这些函数除了返回一个指针之外没有任何共性,但是返回的指针又天差地远。
下面说说函数指针。
指针分为三种类型:对象指针,函数指针和void指针。
函数指针的声明形式是T (*p)(...),其中*p使用括号括起来的原因是函数类型解析的优先级高于指针的解析,故使用括号防止解析成上面的指针函数(其实这两个之间就相差了一对括号)。
函数指针可以绑定到与其返回值和参数类型都相同的函数上。比如:
int foo(int, double); // 函数声明在上面的初始化中,写成&foo也是可以的。
函数指针的最大特点就在于,其不能做一元+-运算(当然也不能做+= -= ++ --等),且对其做一元*运算的结果还是其本身。例如:(接着上面的例子)
bar(1,1.0);甚至你还可以这样:
依然是对的。
所以实际应用中一般采取类似函数调用的方式,这样更加自然。
刚刚去测试了一下,还有一个更加隐蔽的问题:
C中的函数可以采用使用原型或者不使用两种方式。(不使用原型被视为过时)
原型即在函数头中将参数类型及个数都声明,而不使用就是很简单的一对括号。例如:
int foo(); // 非原型这有什么影响呢?看一看下面的一段代码:
我的编译器对this指的一行进行了警告,提醒指针类型不匹配。
我们可以看到,非原型的函数指针可绑定到任意的函数上,而带有原型的函数指针在绑定时可以起到更严格的类型限制。
容易忽略的一点是,不接受任何参数的函数(带原型)的声明方式是int foo(void);,不应该省略void,特别是在使用对应类型的函数指针时,如果省略void,那么错误的绑定也不会被警告。
我还注意到了一个现象:
int foo(char);这段代码同样也给了警告。为什么呢?
因为在不使用原型的情况下,char,short,float等会被隐式提升到与其对应的更高级类型。
而在这个绑定中,bar是非原型,这时可能会进行整型提升,而foo带有原型,调用时不需要进行提升。这样就有可能引发错误。
以上就是函数指针使用过程中需要注意的一点。不过提醒LZ,函数指针使用过程中最好还是使用带有原型的函数指针。
C语言 指针函数 函数指针 什么区别联系?最好有例子?一定采纳
函数指针可以绑定到与其返回值和参数类型都相同的函数上。比如:int foo(int, double); \/\/ 函数声明int (*bar)(int, double) = foo; \/\/ 函数指针在上面的初始化中,写成&foo也是可以的。函数指针的最大特点就在于,其不能做一元+-运算(当然也不能做+= -= ++ --等),且对其做一元*运算...
c语言指针
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型: (1)int*ptr;\/\/指针的类型是int* (2)char*ptr;\/\/指针的类型是char* (3)int**ptr;\/\/指针的类型是int** (4)int(*ptr)[3];\/\/指针的类型是int(*)[3...
C语言的指针有什么优缺点?
1、指针的优点 是标识一块内存。电脑内存上的每一个字节都具有一个编号,称为地址(可以简单理解为指针),任何读写内存的指令都必须携带地址信息,否则电脑不知道读写那块内存。不管程序是用什么语言写的,要运行数据和代码必须驻留内存,CPU要执行指令必须有一个“指针”程序计数器指向内存的代码块,如果...
C++中如何表示从2到10?
指针直接对接内存结构,常见的C语言里面的指针乱指,数组越界根本原因就是内存问题。在指针这个点有无穷无尽的发挥空间。很多编程的技巧都在此集结。 指针还涉及如何申请释放内存,如果释放不及时就会出现内存泄露的情况,指针是高效好用,但不彻底搞明白对于有些人来说简直就是噩梦。 在概念方面问题可以参见此前推文《对于...
C#。指针。句柄。是什么意思。最好能写一个通俗易懂的例子。
也即,句柄本身就是一个指针。映射在这里只是类型转换而已。这种情况有,进程实例句柄或模块句柄,以及资源句柄等等。 b. 基于表格的映射。这是对象指针与句柄之间最普通的映射机制。操作系统创建表格,并保存所有要考虑的对象。需要创建新对象时,要先在表格中找到空入口,然后把表示对象的数据添入其中。当对象被删除时,...
学习c语言很难吗?
特别是在指针的学习上,是一个槛,很多人就是倒在指针上的。当然除了指针,C语言里面还有一些回调、递归、函数指针、指针函数也有一定的难点,所以总的来讲C语言还是有一定的难度 的,学习C语言一定要多练,不能光看书,多做一些项目慢慢地就好了。意志力不够没有耐心,倒在黎明前夕 学习编程主要挺...
在大学学C语言能干什么?有什么用?最妤举些易明白的例子
C语言的基本语法我是不打算再提了,很多C语言编程的书,就是将一些基本的数据类型、数据结构、语法,然后就是一些数值计算的实例,大多数都是雷同的,难免有抄袭之嫌,而且页没有多少实用价值。 本书以实用实例作为编程指导,指引大家编写真正实用的程序。了解到大家对黑客程序、病毒、窗口类程序比较感兴趣,因此我就拿...
求一个函数指针数组例子,直接能复制后运行的最好,程序越容易理解越好...
void Sort(DATE *D,int n,int (*Role)(DATE*,DATE*))\/\/函数指针在此 { int i,j;for(i=0;i<n;i++){ for(j=0;j<n-i-1;j++){ if(!Role(&D[j],&D[j+1])){ DATE t = D[j];D[j] = D[j+1];D[j+1] = t;} } } } int main(){ DATE date[5]={ {1952...
...ifndef endif line 的用法以及意义?最好带例子
被命名的标识符具有类型定义说明的功能。请看下面的例子: #define PIN1 int* typedef (int*) PIN2;从形式上看这两者相似, 但在实际使用中却不相同。下面用PIN1,PIN2说明变量时就可以看出它们的区别: PIN1 a,b;在宏代换后变成 int *a,b;表示a是指向整型的指针变量,而b是整型变量。然而:PIN2 a,b;表示a...
...求帮忙 我应该讲什么 简单点的也行 最好有例子
讲C++中的类吧,这个比较有特色,体现了面向对象,还可以联系实际,以现实生活中的例子类比。时间多就讲讲多态什么的,可长可短。。。求采纳,谢谢