C语言中指针与数组的异同分析
指针的基本思想是以地址代实物,以小管大,以简代繁,其本质是包含某个变量地址的一个变量。而数组名代表的是一个物理地址,数组下标是逻辑地址,从而决定了这两者之间有密切联系,主要有如下两点:
①任何可以由数组实现的操作也能由指针实现。这是因为指针和数组名都是地址,任一数组元素均可由指针表示。例如:设有char array[20];则对任何数组元素array[i](i=0,1…19),可由*(array+i)表示。
②在使用形式上,指针的使用亦可采用数组的表示法,以获得好的可读性。如:char *pointer,array[20];pointer=array;则array[i](i=0,1…19)的内容与*(pointer+i)一样。
当然,指针与数组作为两种不同的数据类型,必然有其区别,主要有如下六点:
①数组具有静态特征,而指针有更多的动态特性和灵活性。数组一经定义,其基址和大小便固定了,在该数组的有效使用范围内是不可变的;但是指针则具有很强的动态特征,可以动态地指向任一该类型(定义决定)变量,这也就决定了它有更大的灵活性(注:与此相关的三个重要函数是:Malloc、Calloc和Free)。
②指针是变量,可以被赋值,数组名不是变量,不可以被赋值。如:array=pointer的表示方法便是错的。
③指针作为地址可以参加一些地址运算,如加法、减法,在特定的环境下(如两指针指向同一数组中的元素)还可进行比较运算,但不同的数组名之间则一般不进行比较运算。
④运算速度上的差异。一般来说,用指针要快些,因为在实际的运算中,总是把数组下标表示通过存储映象函数转换为指针表示,按其地址访问内存,这种转换要进行乘法和加法的运算。
⑤指针数组与多维数组。相对于多维数组,指针数组的每一行可以有不同的长度,有更大的灵活性。如:char a[10][20],*b[10];二维数组a[10][20]每一行有固定的长度20个字符,而指针数组*b[10]每一行的长度则随指针指向不同而发生变化。最常用的指针数组是为了存储不同长度的字符串,如:char *b[]={"hello!","how are you!"};
⑥数组具有较好的可读性,指针具有更强的灵活性。一般,对某些多维数组中非连续的元素的随机访问用下标表示比较方便,当按递增(减)顺序访问数组时,使用指针快捷而且方便。
综上所述,指针与数组既有联系又有区别,在具体应用时可适当选择,当数据是静态时,可用数组;但若用指针,则在灵活性与效率上可获得好处。