1
C语言程序设计
1.6.5 5.5 指针数组

5.5 指针数组

指针数组是指数组的每一个元素都是一个指针变量的数组,与普通数组一样,必须先定义再使用。在定义指针数组时,应在数组名前加上“*”号。

定义指针数组的一般形式为:

  数组类型标识符 *指针数组名[常量表达式]

例如:

  int*pd[5],value=25,i;

定义了指针数组pd,它由pd[0]~pd[4]5个数组元素组成,每个元素都可存放一个指向整型数的指针。

例如,为了将一个整型变量value的地址存放在指针数组pd的第三个元素中,可用语句:

  pd[2]=&value;

要取出这个指针所指向的整数并赋给整型变量i,可用语句:

  i=*pd[2]; 等效于 i=value;

通常,可有两种方法处理多个字符串:一种是定义一个存放多个字符串的二维数组,一种是使用字符型的指针数组。

例如,定义二维数组:

img459

img460

这里,定义status是一个4×16的字符数组。每行存放一个字符串,其列数16是根据字串的最大长度确定的。使用status[i]的形式,可访问字符串,例如:

  printf("%s\n",status[2]);

输出为

  calculate error

采用指针数组,例如有以下定义:

img461

如图5.5.1所示,这里定义了字符型的指针数组status,它包含了4个数组元素,每个数组元素指向一个字符串的首地址,可以通过指针数组元素status[0]~status[3]访问字符串。

如果将各字符串在内存中连续存放,将节省不少的存储空间,因此使用指针数组比用二维数组存放字符串更方便、更有效。当然,为了存储分配的需要,4个字符串常量在内存中也可以不连续地存放在不同地址空间中。

img462

图5.5.1 指向字符串的指针数组

显然,用status[i]可访问第i+1个字符串,用*(status[i]+j)可访问第i+1个字符串中的第j+1个字符。

例如:

  printf("%c\n",*(status[2]+4));

输出字符为:u

即为第三个字符串“calculate error”中的第5个字符。

可见,在使用指针时,编译程序规定,用%s输出指针,是指输出指针指向的整个字符串;用%c输出指针指向的目标变量,是指输出指针当前所指向的一个字符。

指向字符串的指针数组常用于代码查询、错误信息显示及处理多个字符串等功能。

假定一个图形显示系统可以采用10种不同的颜色来显示图形,并为每种颜色规定了相应的数字代码。下面的程序实现输入一个数字,查询它所对应的颜色的功能。

例5-16 指针数组的应用。

程序如下:

img463

程序运行结果:

img464

程序最后一条语句使用函数printf(),按%s的格式输出指针color[8]所指向的字符串。

例5-17 按字典顺序对多个字符串排序。

程序如下:

img465

img466

程序运行结果:

输入:n:6

输出结果:

  basic

  dbase

  fortran

  lisp

  turbo c

  turbo pascal

程序按选择法对6个字符串进行排序,比较两个字符串的大小,使用标准库函数:

  strcmp(字符串1,字符串2)

该函数的功能为对两个字符串从左至右按ASCII码值比较字符的大小,比较结果由函数值返回:

img467