引言
刚接触C++语言的时候,我本人曾经产生过困惑:指针的用途是什么?为什么我感觉他只是在书写上更复杂呢?
虽然不清楚别人有没有类似的问题,但是,对于一个只了解静态结构数组的人来说,有这样的疑惑完全不奇怪。
现在我认为,指针的独一无二之处在于他打开了动态结构的大门。
一、静态结构下的指针
假如我们用输出一个矩阵中所有的entries:
以一个二维数组举例(a[m][n]):(有一些较短的代码手动输入,不打分号)
一般方法:int a[m][n]
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cout<<a[i][j] 可见,一个简单的二重循环就可以完成按行输出的。
指针方法:我们创建一个指针数组,存放行指针,然后按照行输出数组,
由此观之,在静态结构内,指针没有减少我们的工作,反而使得定义内容更加复杂!
二、动态结构下的指针
我们先谈谈动态数组,再从数组到链表,再谈谈插入算法的实现
1.动态数组
int *p;int n=0,b
p=new int [n]
do{cin>>b
p[n++]=b}while(未知控制条件)
动态数组就像一条贪吃蛇,每吞下一个元素就让自己变得更长,这就巧妙地起到了节约空间的效果。我不必要先估算上界,然后开一个巨大的数组,而是通过控制条件的自定义,在适当的时候结束空间申请,不需要担心爆空间。
2.链表
单链表就是一个结构体自引用组合,每个结构体变量内的成员既含有自己的数值,也含有一个next指针,指向下一个结构体变量,也就是链表的下一环。
这种强大的数据结构无疑建立在指针的基础上,没错吧~
以实现插入元素算法为例:
一般的一个数组,要先申请一个更大的数组,然后分两段转移原来的数据,最后插入新元素,这个过程影响了数组中所有的元素。
而链表只要把i-1号元素的next指针指向插入者,而把插入者的next指针指向i位,那就结束了~
代码实现:
操作指针就是操作链表的顺序与内容,不用具体的门牌号,从而简化了流程。
the end
参考资料:信息学奥赛一本通(C++版)(第五版)
活动地址:优快云21天学习挑战赛