13.指针及用法
13.1 什么是指针
如果你想掌握更高深的编程技术,指针是一定要学习的。
在前面变量的学习中,我们说变量代表一个内存单元,要想访问这个内存单元的数据只能指名道姓的使用变量名。
系统为变量分配的内存单元是拥有一个地址数据的,这个地址数据如果非要用一个容器来保存,那只能是一个特殊的变量:指针。
什么是指针呢?指针是一个特殊的变量,里面保存是一个内存地址数据。
13.2 获取地址数据
声明指针很容易:
上图中我们声明了4个指针,每一个指针的类型都不相同,并且用0初始化了每个指针。27行中指针名为pi,指针类型为 int *,你没看错,在声明指针时指针名前要加个*号,而且必不可少。
没有人会声明一个指针而仅仅赋值为0的,声明指针的目的一定是为了保存某个内存空间的地址。一旦你声明了某个类型的指针就可以使用了,问题是如何得到内存地址呢?
第15行我们声明了一个int类型的变量i,如果我们想得到这个变量的地址,只需要这样操作即可:&i。&是一个运算符,是用来得到地址的一个特殊运算符。
现在可以把i的地址保存起来了,这里只能在上图中的4个指针中选择pi来保存变量i的地址。同样可以通过&分别取得其他变量f、b、c的地址,并分别保存在pf、pb、pc指针中。
在上图的例子中你应该已经发现了变量i与指针pi,变量f与指针pf,变量b与指针pb,变量c与指针pc是有一定内在联系的。这个规律就是:int类型变量的地址必须保存在int*类型的指针中,其他变量同理。
13.3 访问指针数据
在把一个变量的内存地址保存在一个指针后,如何通过这个指针获取变量的数据呢?
方法是在指针前加*:解除对指针的引用。第26行 *pi 就可以得到指针指向的内存数据。
13.4指针的用法
1.指向变量
最常见的指针用法是让指针指向某一个变量:
2.指向数组
指针除了可以指向一个变量外,也可以指向一个数组。只要把数组的内存地址保存在指针中即可。
上图中有3个不同类型的指针都指向某一个类型的数组,这里要注意的是:指针可以指向的数组与数组本身的类型有很大关系。得到一个数组的地址并不需要&,数组名就可以表示数组的地址,所以可以把数组名赋值给指针。
如果想通过指针循环输出数组内容可以如下图实现:
上图中循环体中的i代表数组元素的下标,数组名+ i得到的是数组中下标为i的元素的地址,然后解除引用:*(数组名+i),就得到了这个元素的数据了。
3.指向函数
指针还可以指向一个函数。
首先要声明一个函数指针。注意:函数指针的格式要与它指向的函数匹配:返回值类型(*函数指针)(函数参数列表)。
其次,把一个函数名赋值给函数指针。
最后就可以传递参数给函数指针并通过指针来调用函数了。
上图中真正能够体现函数指针威力的在第29行,函数指针可以指向任意一个具有相同返回值和形参的其他函数。函数指针的灵活性让它在编程中得以大展身手。
4.函数形参
指针的另一个重要用法是指针用做函数的形参。
声明函数的形参为指针,是C++编程中普遍的做法。函数的指针参数同引用参数一样能够避免一些额外的性能开销。