7.6 指针的指针
指针的指针意味着指针所指向的内容仍然是另一个指针变量的地址,这在7.2节提到过。指针的指针是指针中的难点,不易理解。本节将向读者详细讲解它的内涵和用途。指针的指针声明方式如下:
- type **ptr;
变量访问内存单元是直接访问,用指针访问内存单元则属于间接访问。如果指针直接指向数据单元,则称为单级间址。单级间址定义时使用一个*号。如果指针指向的内容依然是地址,该地址才指向真正的数据单元,那么这种指针就叫二级间指。二级间指定义时使用两个 *号。
【示例7-15】 假设有字符变量ch='a',则让指针ptr1指向ch,指针ptr2指向ptr1的代码如下所示。
- char ch='a';
- char ptr1=&ch;
- char **ptr2;
- *ptr2=&ptr1;
分析:指针的指向关系如图7-4所示。
在该图中,ch存放在1004单元中,字符变量占一个字节。ptr1存放在1000开始的4字节内存单元中(指针是无符号整型数,占4字节),它的内容是ch所在单元地址1004。ptr2放在1006开始的4字节中,其内容是ptr1所在的内存块的首地址。它们之间的指向关系如图中的箭头所示。
|
| (点击查看大图)图7-4 单级间指与二级间指 |
从图7-4可见,如果用ptr1去访问能ch,则只需要一次跳转就可寻径到ch。而如果通过ptr2来访问ch,则需要先跳转到ptr1,再跳转到ch。
定义中有几个*号就是几级间指,访问到最终数据单元时就需要几级跳转。
【示例7-16】 多级间指举例。
- int ***p;
- int ****p;
分析:理解间指时要从右向左。对于"int ***p;"可按如下过程理解。从右向左,先看到p,表明变量名为p。再向左,遇到*,表明p的内容是地址,*p是指针。继续向左,又是*,表明*p的内容是地址,**p是指针。再向左,还是*,表明**p内容依然是地址,***p是指针。最后再向左是int,没有了*,表明***p的内容是整型数据。
技巧:将指针的指针用于数组和函数传值中。指针的指针常常作为函数的参数,使函数能够修改局部指针变量,即在函数内修改局部指针的指向。在数组处理中,可以用指针的指针来代替多维数组。
【责任编辑:
云霞 TEL:(010)68476606】