【白话杂谈 No.2】一文助你理解指针**与**指针等概念

前言

指针,C/C++的灵魂,让人又爱又恨,今天要探讨的就是无论在学习中还是面试中都十分常见的一系列概念,即指针作为前后缀时的不同情况。

指针数组与数组指针

这俩相对来说比较常见,也好理解,只需要记住一句话:“在后面的才是本质,前面的只是形容。”,也就是说,这俩应该叫做“指针的数组”和“数组的指针”,这么一说是不是就很明确了?实际上在代码里也是这样:

int var1[10];	//这是一个包含10个int类型变量为元素的数组
int* var2[10];	//这是一个包含10个int*类型变量为元素的数组,即指针数组
int(*var3)[10] = &var1;	//这是一个指向包含10个int类型变量为元素的数组的指针,即数组指针

注释里写得很清楚了,这里再稍微总结一下:指针数组不难理解,就是包含指针为元素的数组,而数组指针也与其十分相似,不同的地方在于需要用括号来强调指针属性,且还要注意需要指明其指向的数组的大小。

另外值得一提的是,数组名就是其指针,而且不严格来说,数组指针纯属就是多此一举,普通的指针完全可以胜任数组指针的各种功能,因此一般情况下只需要将其理解为一般指针的一个专门限制为作用于数组的分支就行了。

指针常量与常量指针

还是那句话,“在后面的才是本质,前面的只是形容。”,所以这里也很明显了,就直接上代码吧:

constexpr int const_value = 10;	//这是一个确定的常量,而不是const声明的只读变量
const int* ptr1 = &const_value;
int* const ptr2 = const_cast<int* const>(&const_value);
//ptr2 = const_cast<int* const>(ptr1);

各位大可先分析看看到底哪位是指针常量,哪位是常量指针,鄙人打字累了先歇会

分析好了吗?那这边就揭晓答案咯~

3

2

1

锵锵~,ptr1是常量指针,ptr2是指针常量。如何,分析正确了吗?其实也很简单,从左往右读,很明显ptr1就叫“常量的指针”,ptr2就叫“指针的常量”嘛。

分辨出来后它们的作用也就很明确了,常量指针就是用于指向常量的指针,其指向的变量本身无法更改,但是其指向可以更改。

指针常量就是指针中的常量,是具有常量属性的指针,是只读的,无法直接修改。

(另外有关C++中const在不同位置的作用也十分值得了解,不过这里就不展开了,请期待下一期的白话杂谈吧~)

指针函数与函数指针

呀,还是说到它了,这同样是一个重要的知识点。

指针函数没什么好说的,其实就是“指针的函数”,也就是说,其返回值是指针,比如这样的:

int* func() {
	int* t = (int*)malloc(sizeof(int));
	return t;
}

重点是函数指针。是的,“函数的指针”,函数也有指针,比如这样的:

int func(int a, double b) {
	std::cout << "do sth..." << endl;
	return 0;
}

int(*ptr)(int, double) = func;

这里的ptr就是函数func的一个指针,从这些我们也看得出来,函数名就如数组名一样,也是其本身的一个指针,且类似于数组指针的声明语法,我们也可以按照“函数返回类型(*指针名)(函数参数列表)”的语法来声明一个函数指针。

函数指针的调用也很简单,与一般的函数调用是一样的,如:

ptr(0, 1);	//输出"do sth..."至控制台

对于函数指针的调用,我们也有一个术语称之为“回调函数”,如果将函数指针作为函数的参数进行传递,这时的函数指针又被称为“注册函数”。

说到函数指针,大多数人都会问:“这有什么用,我直接调用原函数不就行了,为什么要多此一举地使用函数指针?”。但一个具体场景就是在实际开发中其实经常会出现许多接口函数的返回值,乃至参数类型都是一模一样的,而如果出现问题要进行调整的话,去被调用的位置一个一个更改明显效率低下,而如果使用函数指针的话则只需要在其初始化的位置进行调整即可,方便许多。

创作背景(?)

最近在学习的过程中又碰到了这些个令人抓狂的家伙,之前每次学习后都觉得理解了,甚至笔记都写得仔仔细细,封笔时颇有种刚刚完成了一篇顶会论文的成就感,可惜的是每当再次遇见它们时,脑海里第一句话只会是:“谁啊你?”。

于是痛定思痛,决心要总结出一套便于理解记忆的规律,便以此文章记录思考,也为各位提供参考。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值