相信很多小伙伴跟我一样,曾经或是现在被函数指针/指针函数 这两个名字搞得头昏脑胀,并且总是傻傻分不清楚,即使是之前某个时候通过百度/Google到的文章搞清楚过,过了一段时间后,又搞忘了。如果您有这样的困扰,那么可以好好看看我这篇文章,或许能将您带出混淆的误区。
指针
要搞清楚这几个混淆误区之前,就不得不搞清楚的就是指针这个玩意儿(ps. 这里主要还是以C/C++语言来对这些个东西进行讲解,毕竟这些个东西在这两门语言中是家常便饭)。
通俗理解指针
我这人写技术文章一直秉持一种想法,就是以自己觉得最通俗易懂的方式将东西写清楚,因此我在此对指针的讲解也是以一种通俗的方式。
我们知道,声明一个变量
int a = 10;
最终的内存布局是这样的
a变量对应着的地址处0x100100存储着10这个数值。
对于指针变量
int a = 10;
int *b = &a;
最终的内存布局就是这样的
从图中可以看出来,其实指针变量b就是和a是个一样的变量而已,只是a的内存地址里存储的直接就是10这个数值,而在变量b的内存地址中存储是一个地址,通过存储着的这个内存地址就可以找存储的那个数值10,也就是我们常说的变量b指向了a的地址。
在我看来,指针就是这么简单,指针变量其实并没什么多大的不一样,指针仍然是和普通变量一样,都是存储着一个值的地址空间而已,只不过普通变量存储着的是具体的那个值,指针变量存储着的是一个地址而已,只是要通过存储着的那个地址值才能找到最终的那个值而已。就是这么简单,只是可能编程语言本身给指针的读和写设置了很多语法糖。
函数指针/指针函数
函数指针和指针函数 其实也同样的很简单很容易理解,就是看你理解的方式了。正如我在文中标记的一样,您会发现我将两个地方加粗了。对,这就是重点,无论是 函数指针/指针函数,还是数组指针/指针数组,只要找到重点就行,这里的重点就是我标注加粗的地方,也就是后面的两个字才是重点。
函数指针 的重点是指针,也就是说,它是个指针,看下面代码
//定义实现一个sum函数
int sum(int a, int b) {
return a + b;
}
int main() {
//定义一个函数指针指向sum函数的地址
int (*varSumFunc)(int a, int b) = sum;
return 0;
}
这里的varSumFunc其实就跟前面的int *b一样的,就是一个指针变量,只是这个指针变量指向的是一个函数地址而已,为何是这样子定义一个函数指针,没有原因,就是语法而已,并且这样子定义可以跟指针函数进行区分。
指针函数的重点就是函数,它是一个函数,只是它返回的值是一个指针类型的变量而已,如以下代码
int *test() {
int a = 10;
int *b = &a;
return b;
}
int main(){
int *t = test();
return 0;
}
通过上面的代码,相信你一定一目了然了吧,所谓的指针函数 就只是一个返回了一个变量的函数而已。
就是这么简单,容易搞混的主要是由于这两个词太想近了,其实只要你明白了这个东西的重点在哪儿,无论你何时想起这两个东东,你都是明了于心的,对吧!!!
网友评论