一招牢记 函数指针和指针函数 的区别

前言

是不是大伙也常这样,差不多每隔一段时间都会搞忘函数指针和指针函数的区别,如果你也有这样的情况的话,那么这篇文章将对你很有用

指针

搞懂什么是指针很重要,关于指针可以有说不完的话,好多人写了好几年的C/C++代码可能都对指针不是很懂。
我不想把指针搞得很难懂,我这里只想给大伙一个简单易懂版本的指针理解。

简单易懂版指针

年轻人不能不讲武德,所以我们这里还是要讲武德的。所谓讲武德就是要正确理解指针是个啥?
所谓的 变量/常量 无非就是一个存储容器,用来存储值的,我们先来看看普通非指针变量存储的是个什么东西。一切复杂的东西都始于简单的东西,我们这里就拿简单的int类型变量来举例子。如下面代码:

int a = 10;

最终的内存布局是这样的:
int a = 10.png
这里我们先假设这里的int类型占用一个字节的存储空间,从上图可以看出来,a变量对应着的地址处0x100100存储着10这个数值。

对于指针变量,最终的内存布局是这样的:
int *b = &a.png
从图中可以看出来,其实指针变量b就是和a是个一样的变量而已,只是a的内存地址里存储的直接就是10这个数值,而在变量b的内存地址中存储是一个地址,通过存储着的这个内存地址就可以找存储的那个数值10,也就是我们常说的变量b指向了a的地址。

在我看来,指针就是这么简单,指针变量其实并没什么多大的不一样,指针仍然是和普通变量一样,都是存储着一个值的地址空间而已,只不过普通变量存储着的是具体的那个值,指针变量存储着的是一个地址而已,只是要通过存储着的那个地址值才能找到最终的那个值而已。就是这么简单,只是可能编程语言本身给指针的读和写设置了很多语法糖。

说这么多,谨记一句话就对了:指针存储着一个地址值,这个地址值指向了真实的值。

函数指针/指针函数 的重点

上面我们知道了指针存储着一个地址值这个知识点,现在我们要重点记住的一点就是:函数指针/指针函数 的重点是什么?

函数指针/指针函数 的重点就在后面的两个字,例如,函数指针的重点就是 指针,说白了,它是一个指针,指针函数的重点就是函数,它是一个函数

数组指针和指针数组同理

总结一点就是,重点在于后面的两个字,后面的两个字决定了它是什么

一招牢记区别

上面说了这么多,就是为了这里大伙更好的理解此刻要讲的点。
现在就来实际操作一波,先解释函数指针

一句话,围绕指针思考就行。另一个刚好跟指针是反着的,并且这里指针的语法定义跟普通的定义是反的

拿下面的函数指针举例子:

//先实现一个函数
int add(int a, int b) 
{
    return a + b;
}
//定义一个函数指针变量,需要用圆括号将变量名跟星号括起来
int (*addVar)(int a, int b) = add;
//调用
int result = addVar(10, 20);
//打印
std::count << result << std::endl;

上述代码是一个函数指针
直接套用上面的那句话
先明确重点,函数指针是个指针。指针的重点就是,存储着一个地址值,这是个函数指针,因此这里就存储着一个函数的入口地址值。最后,指针的定义跟普通的指针定义是反的,反的的意思就是:函数指针的定义需要用圆括号将变量名跟星号括起来,而普通的指针变量是没有用圆括号将变量名跟星号括起来的。 代码如下:

//定义一个函数指针变量,需要用圆括号将变量名跟星号括起来
int (*addVar)(int a, int b) = add;

下面紧接着来看指针函数

int *add(int a, int b) 
{
	int *p = malloc(sizeof(int));
    *p = a + b;
    return p;
}
int *result = add(10, 20);
//打印
std::count << result << std:endl;

继续套用那句话
指针函数是一个函数,不是指针,我们说过,只需要记住指针就行,另一个是反的。也就是,指针函数直接就是一个函数,函数都有返回值,即使是void,也都会返回一个空,也就是说上述代码的返回值就是一个int *。总结就是,指针函数就是一个函数,这个函数返回一个指针类型数据。

总结

重点记住一句话就行,围绕指针思考,另一个跟指针相反就对了。

附加

还有数组指针指针数组也和这个几乎一样的,只是数组指针存储的是多维数组

猜你喜欢

转载自blog.csdn.net/qq_20255275/article/details/109820256