【时时三省】(C语言基础)指针数组和多重指针
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
什么是指针数组
一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。下面定义一个指针数组:
int * p [ 4 ];
由于[]比*优先级高,因此p先与[ 4 ]结合,形成p [ 4 ]形式,这显然是数组形式,表示p数组有4个元素。然后再与p前面的“*”结合,“*”表示此数组是指针类型的,每个数组元素(相当于一个指针变量)都可指向一个整型变量。注意不要写成
int ( * p ) [ 4 ];
定义一维指针数组的一般形式为
类型名*数组名[数组长度];
类型名中应包括符号“*”,如“int *”表示是指向整型数据的指针类型。
什么情况下要用到指针数组呢?指针数组比较适合用来指向若干个字符串,使字符串处理更加方便灵活。例如,图书馆有若干本书,想把书名放在一个数组中,然后要对这些书目进行排序和查询。按一般方法,字符串本身就是一个字符数组。因此要设计一个二维的字符数组才能存放多个字符串。但在定义二维数组时,需要指定列数,也就是说二维数组中每一行中包含的元素个数(即列数)相等。而实际上各字符串(书名)长度一般是不相等的。如按最长的字符串来定义列数,则会浪费许多内存单元。
可以分别定义一些字符串,然后用指针数组中的元素分别指向各字符串。如果想对字符串排序,不必改动字符串的位置,只须改动指针数组中各元素的指向(即改变各元素的值,这些值是各字符串的首地址)。这样,各字符串的长度可以不同,而且移动指针变量的值(地址)要比移动字符串所花的时间少得多。
例题1:
将若干字符串按字母顺序(由小到大)输出。
解题思路:
定义一个指针数组name,用各字符串对它进行初始化,即把各字符串中第1个字符的地址赋给指针数组的各元素。然后用选择法排序,但不是移动字符串,而是改变指针数组的各元素的指向。
编写程序:
运行结果:
程序分析:
在main函数中定义指针数组name,它有5个元素,其初值分别是“Follome " , " BASIC " , " Great Wall " , " FORTRAN”和“Computer design”这5个字符串的首字符的地址。这些字符串是不等长的。
sort函数的作用是对字符串排序。sort函数的形参name也是指针数组名,接受实参传过来的name数组首元素(即name [ 0 ])的地址,因此形参name数组和实参name数组指的是同一数组。用选择法对字符串排序。strcmp是系统提供的字符串比较函数,name [ k ]和name [ j ]是第k个和第j个字符串首字符的地址。strcmp ( name [ k ] , name [ j ] )的值为:如果name [ k ]所指的字符串大于name [ j ]所指的字符串,则此函数值为正值;若相等,则函数值为0;若小于,则函数值为负值。if语句的作用是将两个串中“小”的那个串的序号( k或i之一)保留在变量k中。当执行完内循环for语句后,从第i串到第n串这些字符串中,第k串最“小”。若k = i就表示最小的串不是第i串。故将name [ i ]和name [ k ]对换,也就是将指向第i个字符串的数组元素(是指针型元素)的值与指向第k个字符串的数组元素的值对换,也就是把它们的指向互换。