对像我一样的初学者而言,指针数组、数组指针,听名字就很容易傻傻分不清。对于数组与指针的不同,笔者已经在上一篇文章里面已经做出了相对简单的解释。那么,“指针数组”和“数组指针”这俩货,又是个啥奇怪的东西呢?
为了防止混淆,我们先从命名上给一个分辨它们的“真实身份”的小技巧。这个技巧就是:看名字的最后两个字。比如“数组指针”,它就是指针;而“指针数组”,是一个数组。在不了解它们有啥用的情况下,先分清楚两种相似概念的不同是一件有必要的事情。
在“验明正身”之后,我们首先来谈谈指针数组的详细概念以及基础用法。
在C语言和C++等语言中, 数组元素全为 指针变量的 数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活。一维指针数组的定义形式为:“类型名*数组标识符[数组长度]”。(引自百度百科)指针数组_百度百科baike.baidu.com
用笔者自己的话简单的总结一下:指针数组就是以数组的形式储存的”一串”指针。一个普通的数组可以存放一定数量的数据,这个数据包括了字符、数字、浮点数等。而指针数组,就是一个储存一定数量指针的一个数组。
指针数组的定义形式为:
//type *p[n];
和普通数组的定义相比,定义指针数组时多用了一个“ * ”符号,这显示出了数组中储存的数据的”特别之处”。
下面再随便举几个例子(懒得想了,抄书)
#include
这个简单的例子,不难看出,其实所谓的指针数组,就是一口气定义多个指针,而且可以以类似我们早期学习的调用数组的形式来调用某个固定的指针变量。仔细想想,其实也不算很难,对吧?
当然了,除了原来就有的,笔者还想展示它和“常规“的数组不太那么一样的地方。
谈到数组,就有一个绕不开的话题——字符串。单一的字符串,我们往往用一维数组定义,而多个字符串,我们就要引入二维数组。考虑到可能有很多像我一样基础不那么扎实的萌新,我再举个例子:
char
这个就是初学者们使用的最早最原始的字符串定义方式了。
我们再来看看指针数组怎么定义字符串:
char
我们可以用一维指针数组,定义多个字符串——对比一下二维数组,感觉档次一下就上来了呢?
但是!我要说但是!二维数组和指针数组所定义的字符串,是有区别的!
我用一个例子说明,它们最大的区别是什么:
char
不卖关子了,最终的输出结果是“Hello”。
当我们尝试改变一维指针数组中某个或数个元素之后的时候,和我一样的初学者会很蒙蔽——因为我们做不到,我们无法更改已经定义的指针数组之中的任何一个元素。
至于原因,需要我们学习了更多的知识后才能理解到,这里姑且不提。我们暂时只需要知道,指针数组不像二维数组那么随心所欲了。(其实笔者也不太会......等过几天学通了我再来补吧)
接下来要讨论的,是数组指针的问题。
笔者最开始的时候给出的技巧已经说明了:关注最后两个字。顾名思义,数组指针应该是一个数组,它的定义如下:
数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。(来源于百度百科)
不那么晦涩的说法:就是数组指针,是一个指向数组的指针。
举个栗子~~
int
有几点需要注意:
- 上回书说道:数组本质上是一个地址数据,不需要在初始化指针的时额外添加&取址符号。但是这里情况有所不同,请看第2点。
- 在这里不使用&时,编译器会提示warning,结果也是怪怪的东西。需要注意的是,这里的指针指向的是一整个数组,和普通的指针有所不同。而数组整体在内存中也是单独存放的。为了指针能够指向数组整体,我们需要另外使用一个取址符号来得到整个数组的地址。
- 用指针间接访问数组中某一个数值的话,情况可能会与之前有所不同。请看下面的例子。
#include
相信很多小伙伴看到那两个“ * ”就已经开始怀疑人生了......相信我,我比你的状态好不到哪里去。
我们再来看看一看上面第二点。按照笔者自己的理解就是,数组名本身是一个地址,但是因为这里定义数组指针需要使用数组自身的地址(这和用数组名定义结果是不同的。用数组名直接定义的话,是给予了指针数组的第一个元素的数值,而我们定义的数组指针需要一个具有3个元素的完整数组)。所以,我们在这里例子中使用p,先通过取数组的地址得到了数组名——而正如笔者反复强调的,数组名实际上是一个地址数据,所以在对数组的地址数据进行运算后,再次使用取址符号“*”,就成功取得了对应的数组的值。
这一段确实十分难懂,笔者能力有限,没法写的更加通俗易懂一点......不过我曾经偶然看到的一个生动的小例子,说不定可以帮到你:
- 指针数组:在一个信箱中,有数个不同地址的信件,可以寄往不同的地方。
- 数组指针:在一份信件中,有数张信纸,信纸的数量表示了信中信息量。
参考来源于菜鸟教程:
笔记列表 | 菜鸟教程www.runoob.com由于笔者本人也是一名初学者,错误在所难免。如果有任何不妥之处,还请尽请之处,笔者会尽快更改。