指针与数组
这篇博客用来介绍指针与数组,在本人《歌德巴赫猜想———极限算法》这一节中使用到的一种动态定义数组的方法
很多人是在学完c语言以后就开始学习数据结构与算法这门课程了,在以往的学习中,几乎没有能够使用到数组指针的地方,那么,为什么要介绍“指针与数组”呢?
在今后的学习中,我们要编写的大部分代码是面向于用户的,那么问题来了,如果一个要定义的数组的长度让用户来决定,那么,这个数组要怎么来实现呢?
这就牵扯到了这篇博客的主题——指针与数组。
好的,进入主题,我来介绍一下指针与数组的关系:
首先,数组指针(动态定义数组长度):
数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。
例如:int (*p)[10];
这里对上面的变量定义做一个说明:在c语言编译系统中,[size]的优先级高于,所以,要用优先级最高的()将 * 和变量名“保护”起来,使优先于[size],这样才能实现数组指针的定义。
所以,p即为指向数组的指针,又称数组指针。这里的p的本质是指针,是一个指向一个含有10个int 型变量的数组。
由此,可以推出,假设有这种定义:TYPE (*point)[size],那么,point所指向的空间是一个含有size个TYPE类型元素的数组的首地址。
其次,指针数组:
指针数组,就是说首先是一个数组,而数组的元素是指针,也就是说,如果数组元素都是相同类型的指针,则称这个数组为指针数组。所谓相同类型的指针是说指针所指向的对象类型是相同的。
这里来举个例子,在过去的学习中,我们学习过字符串,而字符串的类型是char *,所以假设一个数组的类型是char *,那么该指针数组就是类似于存放字符串的数组,只不过数组中的每个元素都是对应字符串的指针。
例如:二维指针数组可以定义为:char *array[2]={"uxiebi2ue2bx","jevi2hexo"}};
在这里,这里来解释一下:
array数组的类型是char *[2],那么,该数组就是一个含有两个元素的空间,并且各元素均指向一个长度任意的字符串的空间。
由此,可以推出,假设有这种定义:TYPE shuzu[size],那么shuzu数组的类型是TYPE[size],所以,该数组含有size个元素,并且各元素均为含有任意个TYPE 型变量的连续存储空间的首地址(即:指向含有任意个TYPE类型变量的连续存储空间)。
看了上面的描述后,连我都有点晕乎了。
那么最后,来为这两个“关系复杂”的名词进行一个总结:
其实我们要分别这两个定义其实很简单,究其本质去观察:
1.指针数组的本质是数组,它的修饰词是指针,那么这个数组的各元素均为指针,指向空间由TYPE前的部分来定义,个数由size决定。
2.数组指针的本质是指针,它的修饰词是数组,那么这个指针所指向的是一个数组的首地址,那么,被指向的数组的类型和长度由(TYPE)以外的部分来决定 。
而关于怎么去使用这两个概念,我们需要用到<malloc.h>库中的 colloc(首推) 或者 malloc 以及 free函数。
至于详细操作,可以在本人本专栏文章中的一篇验证哥德巴赫猜想的博文中用到