您的位置:首页 > 其它

关于指针函数和函数指针的问题(一)

2010-10-12 23:38 246 查看

函数指针和指针函数这是两个不同的概念,但总是容易混淆。希望下面的这些对大家都能够有所帮助。

从语言学的角度来讲,函数指针和指针函数均属偏正短语,所以根据这一点来看,这两个概念的含义就比较好理解了。

这里我们先来看指针函数吧。

所谓指针函数,在本质上来讲,它属于函数的范畴,只是他的返回值不在是不同的值,而是一个指针值(或者说是一个地址)。这里先让我们看一个函数:

#include <stdio.h>
int *hello (int a, int b) {
int c = a+b;
return &c;
}
int main () {
int a = 5;
int b = 6;
int *iPointer;
iPointer = hello(a,b);
printf("%0x/n",iPointer);
printf("%d/n",&iPointer);
return 0;
}

让我想象一下这个函数会的两条输出语句的结果会是怎样的呢?当然第一个输出语句我们仅仅知道因该是一个地址值但我们是不知道具体是哪个地址值,而对第二个输出语句,我们希望的是得到a+b的值(即11)。想一想,我们真的能得到想要的值吗?也许能,也许不能。还是让我们看看输出结果吧:



这就是两个输出结果了,为什么第二个不是11呢?这个问题,先暂时等一下在来探讨了,这里我们先看另一个问题,在上面的程序中有下面这样一个函数:

int *hello (int a, int b) {
int c = a+b;
return &c;
}
我们能把其中的return &c;直接改写成,return &(a+b);么?当然有一点点编程经验的人都知道,这是当然不行的,不过在这里还是想说一下,应为通常我们都习惯返回一些普通变量,所以常常会有return a+b;这样的用法,所以有事我们容易犯一种习惯性思维,而返回return a+b;(当然,其理由在于,a+b作为计算的结果是作为右值返回的,是一个常量,而该函数要求的返回值是一个指针,是一个地址值,因此,我们必须返回一个左值,而非右值)。

这里我们该来解决上面遇到的第二个输出不是我们想要的结果的问题了,仔细想想。在解开这个问题之前,我们先对上面的代码做一个改动如下:

#include <stdio.h>
int c;
int *hello (int a, int b) {
c = a+b;
return &c;
}
int main () {
int a = 5;
int b = 6;
int *iPointer;
iPointer = hello(a,b);
printf("-----%0x-----/n",iPointer);
printf("-----%d-----/n",*iPointer);
return 0;
}

这里在让我们看看其结果:



这里我们得到了我们想要看到的11,相比上面代码已经能够告诉我们问题的所在了吧。当然这就涉及到作用域了,当然,作用域就本身而言是简单的但当作用域与其他一些概念结合起来后就又变得复杂了,希望以后有机会了,在来探讨作用域的问题。

接下来,我们还是继续我们话题的另一部分,函数指针。不用说,想必通过字面意思我们已经知道,函数指针其实就是说,是一个指向函数的指针,其实质是一个指针,只是这个指针指向的是一个函数。那么既然如此,函数指针该怎样定义有怎样使用呢?对这个问题,对于多数人来说都得自己探索,应为指针在很多的编程语言中是不存在的,而对于教学中的基础课C/C++对这一点涉及又是少之又少。下面,我们先来看看函数指针的定义方式吧:

数据类型标志符 (指针变量名) (形参列表);

首先是数据类型标志符,它是指函数指针所指向函数的返回值类型,然后是(指针变量面),为什么有个括号呢?这就与符号的组合和运算符的优先级有关了,我们知道括号的优先级高于指针。因此,若是没有括号的话,那么按照优先预算法则,就会成了指针函数了。当然,形参列表是可变的,当然也可以没有形参,但是我们在使用时,必须注意函数指针所指向的函数的形参必须与函数指针的形参列表想具有相同的对应关系否则是无法通过编译的。对于具体的用法,看下面的小程序,就不在啰嗦了。

#include <stdio.h>
int (*test)(int a, int b);
int hello(int a, int b) {
return a+b;
}

int main () {
int a,b;
a = 5;
b = 6;
test = hello;
printf("====%0x====/n",&test);
printf("====%0x====/n",test);
printf("====%0x====/n",*test);
int c = test(a,b);
return 0;
}

对于运算结果如下:



仔细看看,原来test和*test的结果是一样的怎么会这样呢?这个问题留着下次再继续探讨了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: