--事物的难度远远低于对事物的恐惧!
有些天没更新内容了,今天我们就来说说数组指针和指针数组,可能很多人对这两个概念比较混淆,其实也比较简单,首先我们来分析下它们的名称:
数组指针:首先它是指针,然后指向数组
指针数组:首先它是数组,然后数组中的元素是指针
为了比较好的理解上边两句话,我们首先要来了解一下数组类型:
-C语言中的数组有自己特定的类型
-数组的类型由元素类型和数组大小共同决定
例如:int array[5]的类型为int[5],而不是int,int只元素的类型。
有了数组类型的概念,我们还知道,在C语言中,可以使用typedef来为一个类型重命名,例如:typedef int INT;就是给int起了个新名字INT。对于使用typedef给重命名一个类型的语句格式,很多人对重命名数组类型或者函数类型比较摸不着脑袋,我来说说我自己的理解,我自己概括为2个步骤:
第一步:首先用类型定义一个变量,例如:int a;
第二步:在定义语句前加上typedef关键字,然后把变量名改成你希望的类型名即可,例如:typedef int INT;
现在我们来套用下typedef的使用步骤,比方我们给int[5]类型的数组重命名为AINT5:
第一步:定义一个类型为int[5]的数组,即:int array[5]
第二步:定义语句前加typedef关键字,然后把变量名array改成重命名的类型名AINT5,即有typedef int(AINT5)[5](注意把括号加上,要不就成了:typedef intAINT5[5],编译器是识别不了这是什么的)
经过以上两步,我们就可以使用重命名后的数组类型AINT5定义数组了,比方:AINT5 iarray,此时就等同于int iarray[5]。相信你已经理解了,用比较官方的重命名数组就是 : typedef type(name)[size]。
有了上边的铺垫,我们来进入正题了,数组指针。我们知道,我们之前定义一个只指针,格式为type *pName;就定义了一个指向type类型的指针变量pName。例如:int *p; 同理,定义数组指针就是 AINT5 *pA,还原到原始类型名,就是 int(*pA)[5],这个时候pA就指向了一个元素个数为5,元素类型为int的数组,我们来总结一下:
-数组指针用于指向一个数组
-数组名是数组首元素的起始地址,但并不是数组的起始地址
-将取址地址符&作用于数组名可以得到数组的起始地址
-可通过数组类型定义数组指针:ArrayType *pointer;
-也可以直接定义: type(*pointer)[n] (注意[]符的优先级要高于*符,要表明pointer是指针,必须要先与*符结合,所以别忘了加括号,如果写成type* pointer[n],那么pointer就是指针数组,而不是数组指针了)
有了以上的理解,下边来看一段代码,你们觉得执行后会输出什么呢?
#include <stdio.h> typedef int(*pArray)[5]; int main() { int array[5] = {1,2,3,4,5}; int(*pA1)[5] = &array; pArray pA2 = &array; int *p = array; printf("(*pA1)[0] = %d\n", (*pA1)[0]); printf("(*pA2)[0] = %d\n", (*pA2)[0]); printf("p[0] = %d\n", p[0]); return 0; }
好吧,相信你已经知道结果了,我们来执行一下:
说完了数组指针,现在我们来说说指针数组,从名字上看,"指针数组"首先得是数组,再而数组的元素是指针。
-指针数组是一个普通的数组
-指针数组中每个元素为一个指针
-指针数组的定义:type* pArray[n](此处pArray会先与[n]结合,原因上文中已经解释过,[]符的优先级要高于*符)
例如float* a[3];就定义了一个指针数组,数组的元素类型为float*型,在内存中表示形式为:
下边来段代码理解一下:
#include <stdio.h> int main() { int array1[5] = {1,2,3,4,5}; int* array2[5] = {NULL}; int i=0; for (i=0; i<5; i++) { array2[i] = (array1 + i); } for (i=0; i<5; i++) { printf( "%d\n", *(array2[i]) ); } return 0; }
执行输出,比较好理解,就不解释了:
小结:
-数组的类型由元素类型和数组大小共同决定
-数组指针是一个指针,指向对应类型的数组
-指针数组是一个数组,其中每个元素都为指针
-数组指针遵循指针运算法则
-指针数组拥有C语言数组的各种特性