5.2.7 C51的指针数组
指针数组是同一数据类型的指针作为元素构成的数组。指针数组中的每个数组元素都必须是指针变量。指针数组的定义格式如下。
类型标识符*数组名[常量表达式];
其中,类型标识符是指针数组的类型,“[]”内的常量表达式为指针数组的大小。典型的指针数组的声明示例如下。
char*p[10];
本例中,定义了一个指针数组p,数组中的每个元素都是指向字符型变量的指针。该数组由10个元素组成,即p[0]、p[1]、p[2]、……、p[9]均为指针变量。
指针数组名为p满足一般的数组的以下运算规则。
❑p为数组名,同时也表示指针数组的首地址。
❑p+i为指针数组的第i个元素的地址。
❑*p等价于p[0],即指针数组的第一个元素。
❑*(p+i)等价于p[i],即数组的第i个元素。
注意使用中要注意指针数组与数组指针的区别。指针数组是数组,其中的数组元素必须是指针;而数组指针是指针,是指向数组的指针,数组中的元素可为任何类型。
指针数组可以用来对字符串进行操作。对于由字符串常量定义的二维字符串数组,如果字符串的长度不一致,系统会按最长的字符串来定义二维数组的长度。这样就浪费部分单片机的存储空间。例如,定义存储每个星期的英文名称的字符串数组week,采用二维字符串数组的定义方式,表示如下。
char week[7][10]={“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”,“Saturday”,“Sunday”};
其中,虽然有些单词字符比较少,但最长的字符串“Wednesday”的长度为10,需要按其来定义数组长度,即必须定义为week[7][10]。如果采用指针数组,就可以解决这个问题,其定义形式如下。
char*week[7]={“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”,“Saturday”,“Sunday”};
该语句只定义了一个一维字符型指针数组。将存放字符串的首地址赋值给指针数组的对应元素。数组的每个元素对应于一个字符串,例如week[0]指向“Monday”、week[1]指向“Tuesday”等。这样就不会使用多余的内存单元,提高了单片机的资源利用率,并使字符串的操作更加清晰、方便。
指针数组的程序示例如下。
include<stdio.h>//头文件
void main()//主函数
{
int k;
char*week[7]={“Monday”,“Tuesday”,“Wednesday”,//定义并初始化字符型指针数组
“Thursday”,“Friday”,“Saturday”,“Sunday”};
for(k=0;k<7;k++)//循环输出字符串
printf(“week[%d]=%s\n”,k,week[k]);
}
该程序可以在KeilµVision3编译环境中执行,运行的结果如下。
week[0]=Monday
week[1]=Tuesday
week[2]=Wednesday
week[3]=Thursday
week[4]=Friday
week[5]=Saturday
week[6]=Sunday
本例中,先定义并初始化了字符型指针数组week,并将每个星期的英文名称字符串的首地址赋值给指针数组的对应元素,然后通过for循环语句,将指针数组的每个数组元素对应的字符串输出。