C语言中指针与数组的异同分析

Author: 张洪伟 Date: 1997-01-01

  由于C语言具有可移植性好、多操作系统支持、效率高和灵活性好等优点,至今仍然是主要的程序开发语言。而指针作为C语言区别于其它语言的重要特征之一,具有很大的灵活性,更是受到软件人员的青睐。同时,数组在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!"};
  ⑥数组具有较好的可读性,指针具有更强的灵活性。一般,对某些多维数组中非连续的元素的随机访问用下标表示比较方便,当按递增(减)顺序访问数组时,使用指针快捷而且方便。
  综上所述,指针与数组既有联系又有区别,在具体应用时可适当选择,当数据是静态时,可用数组;但若用指针,则在灵活性与效率上可获得好处。