4.5.4 指针数组

    指针变量也可以作为数组元素,数组的定义要求这些指针变量必须是相同类型的,也就是说,这些指针指向的程序实体必须是同类型的。


    short*sz[4];

    上述语句声明了一个大小为4的一维数组,数组中的每个元素都是指向short型数据(占两个内存字节)的指针,图4.6是指针数组sz的示意图,sz中的每个元素存储的都是short型变量的地址,这些short型变量(x1、x2、x3和x4)在内存中的地址没有要求。这样,便可以通过数组元素间接访问short型变量x1、x2、x3和x4。

    注意

    “shortsz[4]”与“short(sz)[4]”的区别。“short(*sz1)[4];”表示定义了一个指向数组的指针sz1,sz1指向的数组是大小为4的一维整型数组,其结构如图4.7所示。

    4.5.4 指针数组 - 图1

    图 4.6 指针数组sz的示意图

    4.5.4 指针数组 - 图2

    图 4.7 指针数组示意图

    用指针数组处理字符串是十分方便的,见示例代码4.12,在用户输入一个0~5的整数后,程序会给出对应的英语单词。

    代码4.12 使用指针数组处理字符串ArrayofPointer


    <—————————————文件名:example412.cpp——————————————> 01 #include<iostream> 02 int main() 03 { 04 using namespace std; 05 //创建一个指针数组words,其中每个元素都是字符串(指针) 06 char*words[]={"zero","one","two","three","four","five"}; 07 int xInput; 08 cout<<"请输入一个0~5(包括0和5)的整数:"<<endl; 09 cin>>xInput; 10 cout<<"英语:"<<words[xInput]<<endl; 11 return 0; 12 }

    输出结果如下所示。


    请输入一个0~5(包括0和5)的整数: 4(用户输入) 英语:four

    【代码解析】代码4.12中,声明了一个大小为6的指针数组,其中的每个元素指向一个字符串,程序采用了诸如“zero”、“one”……的形式对char*型数组元素初始化,此处的“one”等称为常量字符串,位于系统的只读存储区,关于存储区的详细介绍参见第6章的内容。编译器将这些常量字符串解释为字符串首字节的内存地址,并对数组元素进行初始化。

    说明

    “char*p="abcd";”与“char p[]="abcd";”,前者是声明了指向常量字符串"abcd"的指针p,后者开辟了一块内存区域,用以存放字符'a'、'b'、'c'、'd'和'\0'。前者的"abcd"解释为常量字符串"abcd"的内存地址,后者为字符数组p的初始化字符串。

    代码第10行,“cout<<"英语:"<<words[xInput]<<endl;”一句中,字符型指针相当于一个字符串名变量,对指针所指的字符串进行整体输出,直到遇到结束符号(即空格符)'\0'停止。但应注意,“cout<<字符指针;”完成的是字符串整体输出,但“cout<<*字符指针;”仅仅输出指针所指位置的一个字符,这只是指针的间接引用。

    使用指针数组管理字符串能有效地节省内存空间,代码4.13给出了一个对比范例,通过声明一个二维的char型数组可以达到同样的目的。

    代码4.13 使用二维char型数组管理字符串TwoDimensionCharArray


    <—————————————文件名:example413.cpp——————————————> 01 #include<iostream> 02 int main() 03 { 04 using namespace std; 05 //创建二维char型数组,用来存储字符串 06 char words[][6]={"zero","one","two","three","four","five"}; 07 int xInput; 08 cout<<"请输入一个0~5(包括0和5)的整数:"<<endl; 09 cin>>xInput; 10 cout<<"英语:"<<words[xInput]<<endl; 11 return 0; 12 }

    输出结果如下所示。


    请输入一个0~5(包括0和5)的整数: 3 英语:three

    【代码解析】代码第6行,声明了一个6×6的二维char型数组才能存储所需要的字符串信息,数组第2维的大小取决于最长的字符串("three"),如图4.8所示;而使用指针数组则可以按照每个字符串的实际长度存储,如图4.9所示。对于一些要求严格的程序,使用指针数组管理字符串能有效节省内存。

    4.5.4 指针数组 - 图3

    图 4.8 使用二维char型数组管理字符串

    4.5.4 指针数组 - 图4

    图 4.9 使用char型指针数组管理字符串