今天我们来聊一聊数组指针,对于C语言中常见数据类型,数组和指针可能学过C语言的都不陌生,但两个合起来又是怎么一回事呢?首先要理解数组指针,我们需要先从数组和指针说起。
数组,什么是数组?即是将相同数据类型的元素连续紧密的存储,称这种数据类型叫数组。数组名即代表该数据类型本身同时他本质上却又是一个地址,即数据元素的首地址。通常访问数据一般使用”数组名[数组下标]”的方式访问数组中的元素,当然也可以使用部分的指针方式去操作。
那什么又是指针呢?指针即是地址,这种说法其实不太准确。通常我们所说的指针是指指针变量,何为指针变量?指针变量是指一个存储地址的变量,即是说一个变量中存放了一个地址数据,这个地址是指向一个某个数据类型的。通常一个未赋初始值的指针变量叫作野指针,这种指针在程序中是很危险的,因该指针除赋值以外的任何指针操作都将是危险的,会发生意想不到的问题甚至错误。通常对于一个还不便于建立指向关系的指针,通常我们会把它的值设置为NULL,即地址0,这个指针称作空指针。
那什么是数组指针呢?通常我们中文的语法结构,事物的本质或重点一般会放在后边,即数组指针,本质上是一个指针,什么指针呢?一个指向数组的指针。那么前面我们说到数组名本身就是一个地址,而一个指向地址的指针,则这个指针至少是一个二级指针,那如何定义和使用这个指针呢?例如有一个整型数组int a[5];那么定义数组指针并指向它:int (*p)[5] = &a;则称p为一个指向有5个元素的整型数组指针。通常数组指针跟二维数组在一起出现。例如,当我们想要将一个二维数组作为形参传入函数,那么这个形参该如何定义?通常这种形参是一个指针,一个可以指向二维数组中每一个一维数组的指针,即数组指针。例如有整型二维数组 int b[2][3];那么形参的数组指针应该这样定义 int (*q)[3];则此时 q=b;数组指针和二维数组可以直接赋值即建立指向关系。其实二维数组名就是一个地址,一个指向一维数组的地址,即它的本质就是一个数组指针。通常我们在进行动态内存分配时也时常会用到数组指针。比如,我使用malloc函数开辟了一段内存空间,我想以二维数组的方式操作这片内存,这时就需要一个数组指针去存放这个地址。
那数组指针有哪些操作呢?因为数组指针本质上是一个指针,所以所有的指针操作都可以对它进行。当对数组指针进行++或--操作时,地址的移动是一个指向的单位,即一个数组的长度。因此数组指针的定义必须给定指针指向的数组的元素个数。同时,也可以将指针数组当做一个二维数组来使用,但不管如何使用都必须要注意不能内存越界。